Эх сурвалжийг харах

Merge branch 'dev' of http://110.188.24.182:10023/Fengwo/hotline into dev

xf 8 сар өмнө
parent
commit
ec9fec12e2

+ 33 - 0
src/Hotline.Api/Controllers/Bi/BiOrderController.cs

@@ -4023,5 +4023,38 @@ namespace Hotline.Api.Controllers.Bi
 
         }
 
+        /// <summary>
+        /// 扭转信件统计
+        /// </summary>
+        /// <param name="dto"></param>
+        /// <returns></returns>
+        [HttpGet("ordervisit-jude-statistics")]
+        public async Task<List<OrderVisitJudeStatisticsRep>> OrderVisitJudeStatistics([FromQuery] OrderVisitJudeStatisticsReq dto)
+        {
+            var list = await _orderApplication.OrderVisitJudeStatistics(dto).ToListAsync();
+            return list;
+        }
+
+        /// <summary>
+        /// 扭转信件统计
+        /// </summary>
+        /// <param name="dto"></param>
+        /// <returns></returns>
+        [HttpPost("ordervisit-jude-statistics-export")]
+        public async Task<FileStreamResult> OrderVisitJudeStatisticsExport([FromBody]ExportExcelDto<OrderVisitJudeStatisticsReq> dto)
+        {
+            var query = _orderApplication.OrderVisitJudeStatistics(dto.QueryDto);
+            List<OrderVisitJudeStatisticsRep> exportList;
+            exportList = await query.ToListAsync(HttpContext.RequestAborted);
+            var ordersDtos = _mapper.Map<ICollection<OrderVisitJudeStatisticsRep>>(exportList);
+            dynamic? dynamicClass = DynamicClassHelper.CreateDynamicClass(dto.ColumnInfos);
+            var dtos = ordersDtos
+                .Select(stu => _mapper.Map(stu, typeof(OrderVisitJudeStatisticsRep), dynamicClass))
+                .Cast<object>()
+                .ToList();
+
+            var stream = ExcelHelper.CreateStream(dtos);
+            return ExcelStreamResult(stream, "扭转信件统计");
+        }
     }
 }

+ 48 - 24
src/Hotline.Api/Controllers/OrderController.cs

@@ -1193,34 +1193,58 @@ public class OrderController : BaseController
     [HttpGet("visit/judge-query")]
     public async Task<PagedDto<OrderVisitDto>> VisitJudgeQuery([FromQuery] VisitJudgeQueryReq dto)
     {
-        var (total, items) = await _orderVisitRepository.Queryable()
-            .Includes(x => x.Order)
-            .Includes(x => x.Employee)
-            .Where(x => x.VisitState == EVisitState.Visited)
-            .WhereIF(!string.IsNullOrEmpty(dto.No), x => x.No == dto.No)
-            .WhereIF(!string.IsNullOrEmpty(dto.Title), x => x.Order.Title.Contains(dto.Title))
-            .WhereIF(!string.IsNullOrEmpty(dto.VisitUserName), x => x.Employee.Name.Contains(dto.VisitUserName))
-            .WhereIF(!string.IsNullOrEmpty(dto.AcceptType), d => d.Order.AcceptTypeCode == dto.AcceptType)//受理类型
-            .WhereIF(!string.IsNullOrEmpty(dto.Hotspot), d => d.Order.HotspotSpliceName != null && d.Order.HotspotSpliceName.Contains(dto.Hotspot))//热点类型
-            .WhereIF(!string.IsNullOrEmpty(dto.OrgId), d => d.Order.CurrentHandleOrgId == dto.OrgId)//接办部门
-            .WhereIF(!string.IsNullOrEmpty(dto.NameOrNo),
-                d => d.Order.AcceptorName.Contains(dto.NameOrNo!) || d.Order.AcceptorStaffNo.Contains(dto.NameOrNo!)) //受理人/坐席
-            .WhereIF(dto.CreationTimeStart.HasValue, d => d.CreationTime >= dto.CreationTimeStart) //受理时间开始
-            .WhereIF(dto.CreationTimeEnd.HasValue, d => d.CreationTime <= dto.CreationTimeEnd) //受理时间结束
-            .WhereIF(dto.ActualHandleTimeStart.HasValue, d => d.Order.ActualHandleTime >= dto.ActualHandleTimeStart) //办结时间开始
-            .WhereIF(dto.ActualHandleTimeEnd.HasValue, d => d.Order.ActualHandleTime <= dto.ActualHandleTimeEnd) //办结时间结束
-            .WhereIF(dto.VisitTimeStart.HasValue, d => d.VisitTime >= dto.VisitTimeStart) //回访开始时间
-            .WhereIF(dto.VisitTimeEnd.HasValue, d => d.VisitTime <= dto.VisitTimeEnd)
-            .WhereIF(dto.IsIng == true, d => d.JudgeState == EJudgeState.Judging)
-            .WhereIF(dto.IsIng == false, d => d.JudgeState != EJudgeState.Judging)
-            .WhereIF(dto.JudgeState != null, d => d.JudgeState == dto.JudgeState)
-            .WhereIF(dto.OrgJudge != null, d => d.OrgJudge == dto.OrgJudge)
-            .WhereIF(dto.SeatJudge != null, d => d.SeatJudge == dto.SeatJudge)
-            .OrderByDescending(x => x.VisitTime)
+        var (total, items) = await _orderRepository.VisitJudgeQuery(dto)
             .ToPagedListAsync(dto.PageIndex, dto.PageSize, HttpContext.RequestAborted);
         return new PagedDto<OrderVisitDto>(total, _mapper.Map<IReadOnlyList<OrderVisitDto>>(items));
     }
 
+    /// <summary>
+    /// 扭转列表查询基础数据
+    /// </summary>
+    /// <returns></returns>
+    [HttpGet("visit/judge-query-basedata")]
+    public async Task<object> VisitJudgeQueryBaseData()
+    {
+        return new
+        {
+            FiledTypeOptions = EnumExts.GetDescriptions<FiledType>(),
+            AcceptTypeOptions = _sysDicDataCacheManager.GetSysDicDataCache(SysDicTypeConsts.AcceptType),
+            OrgsOptions = await _organizeRepository.GetOrgJson(),
+            CallForwardingOptions = _sysDicDataCacheManager.GetSysDicDataCache(SysDicTypeConsts.CallForwardingSource)
+        };
+    }
+
+    /// <summary>
+    /// 扭转列表导出
+    /// </summary>
+    /// <param name="dto"></param>
+    /// <returns></returns>
+    [HttpPost("visit/judge-query-export")]
+    public async Task<FileStreamResult> VisitJudgeQueryExport([FromBody]ExportExcelDto<VisitJudgeQueryReq> dto)
+    {
+        var query = _orderRepository.VisitJudgeQuery(dto.QueryDto);
+
+        List<OrderVisit> datas;
+        if (dto.IsExportAll)
+        {
+            datas = await query.ToListAsync(HttpContext.RequestAborted);
+        }
+        else
+        {
+            var (_, items) = await query.ToPagedListAsync(dto.QueryDto, HttpContext.RequestAborted);
+            datas = items;
+        }
+        var orderDtos = _mapper.Map<ICollection<OrderVisitDto>>(datas);
+        dynamic? dynamicClass = DynamicClassHelper.CreateDynamicClass(dto.ColumnInfos);
+        var dtos = orderDtos
+            .Select(stu => _mapper.Map(stu, typeof(OrderVisitDto), dynamicClass))
+            .Cast<object>()
+            .ToList();
+
+        var stream = ExcelHelper.CreateStream(dtos);
+        return ExcelStreamResult(stream, "扭转明细");
+    }
+
     /// <summary>
     /// 扭转满意度
     /// </summary>

+ 1 - 0
src/Hotline.Api/Controllers/SysController.cs

@@ -318,6 +318,7 @@ namespace Hotline.Api.Controllers
                 throw UserFriendlyException.SameMessage("无效字典类型");
             var dicData = _mapper.Map<SystemDicData>(dto);
             dicData.DicTypeCode = dicType.DicTypeCode;
+            dicData.IsShow = true;
             _systemDicDataCacheManager.RemoveSysDicDataCache(dicType.DicTypeCode);
             await _sysDicDataRepository.AddAsync(dicData);
         }

+ 9 - 1
src/Hotline.Application/Orders/IOrderApplication.cs

@@ -273,5 +273,13 @@ namespace Hotline.Application.Orders
         /// </summary>
         /// <returns></returns>
 		ISugarQueryable<OrderCenterAcceptUserVo> OrderCenterAcceptUser(OrderCenterAcceptPagedRequest dto);
-	}
+
+        /// <summary>
+        /// 扭转信件统计
+        /// </summary>
+        /// <param name="dto"></param>
+        /// <returns></returns>
+        ISugarQueryable<OrderVisitJudeStatisticsRep> OrderVisitJudeStatistics(OrderVisitJudeStatisticsReq dto);
+
+    }
 }

+ 34 - 0
src/Hotline.Application/Orders/OrderApplication.cs

@@ -2016,5 +2016,39 @@ public class OrderApplication : IOrderApplication, IScopeDependency
     }
 
 
+    /// <summary>
+    /// 扭转信件统计
+    /// </summary>
+    /// <param name="dto"></param>
+    /// <returns></returns>
+    public ISugarQueryable<OrderVisitJudeStatisticsRep> OrderVisitJudeStatistics(OrderVisitJudeStatisticsReq dto)
+    {
+        if (!dto.EndTime.HasValue)
+        {
+            dto.EndTime = dto.StartTime?.AddDays(1).AddSeconds(-1);
+        }
+        else
+        {
+            dto.EndTime = dto.EndTime?.AddDays(1).AddSeconds(-1);
+        }
+       return _orderVisitRepository.Queryable()
+            .WhereIF(dto.StartTime.HasValue, x => x.VisitTime >= dto.StartTime)
+            .WhereIF(dto.EndTime.HasValue, x => x.VisitTime <= dto.EndTime)
+            .GroupBy(x => new { EmployeeId = x.EmployeeId, Name = x.Employee.Name })
+            .Select(x => new OrderVisitJudeStatisticsRep()
+            {
+                EmpId = x.EmployeeId,
+                EmpName = x.Employee.Name,
+                OrgJudeCount = SqlFunc.AggregateSum(SqlFunc.IIF(x.OrgJudge.HasValue, 1, 0)), //部门扭转总件
+                OrgJudeApprovalingCount = SqlFunc.AggregateSum(SqlFunc.IIF(x.OrgJudge.HasValue && x.JudgeState == EJudgeState.Judging, 1, 0)),
+                OrgJudeSuccessCount = SqlFunc.AggregateSum(SqlFunc.IIF(x.OrgJudge.HasValue && x.JudgeState == EJudgeState.Agreed, 1, 0)),
+                OrgJudeFailCount = SqlFunc.AggregateSum(SqlFunc.IIF(x.OrgJudge.HasValue && x.JudgeState == EJudgeState.UnAgreed, 1, 0)),
+                SeatJudeCount = SqlFunc.AggregateSum(SqlFunc.IIF(x.SeatJudge.HasValue, 1, 0)),
+                SeatJudeApprovalingCount = SqlFunc.AggregateSum(SqlFunc.IIF(x.SeatJudge.HasValue && x.JudgeState == EJudgeState.Judging, 1, 0)),
+                SeatJudeSuccessCount = SqlFunc.AggregateSum(SqlFunc.IIF(x.SeatJudge.HasValue && x.JudgeState == EJudgeState.Agreed, 1, 0)),
+                SeatJudeFailCount = SqlFunc.AggregateSum(SqlFunc.IIF(x.SeatJudge.HasValue && x.JudgeState == EJudgeState.UnAgreed, 1, 0))
+            });
+    }
+
     #endregion
 }

+ 40 - 2
src/Hotline.Repository.SqlSugar/Orders/OrderRepository.cs

@@ -27,15 +27,17 @@ namespace Hotline.Repository.SqlSugar.Orders
     {
         private readonly IDataPermissionFilterBuilder _dataPermissionFilterBuilder;
         private readonly IRepository<OrderSendBackAudit> _orderSendBackAuditRepository;
+        private readonly IRepository<OrderVisit> _orderVisitRepository;
 
 		public OrderRepository(ISugarUnitOfWork<HotlineDbContext> uow,
             IDataPermissionFilterBuilder dataPermissionFilterBuilder,
-            IRepository<OrderSendBackAudit> orderSendBackAuditRepository
+            IRepository<OrderSendBackAudit> orderSendBackAuditRepository,
+            IRepository<OrderVisit> orderVisitRepository
 			) : base(uow, dataPermissionFilterBuilder)
         {
             _dataPermissionFilterBuilder = dataPermissionFilterBuilder;
             _orderSendBackAuditRepository = orderSendBackAuditRepository;
-
+            _orderVisitRepository = orderVisitRepository;
 		}
 
         public async Task<string> AddOrderNavAsync(Order order, CancellationToken cancellationToken)
@@ -1200,6 +1202,42 @@ namespace Hotline.Repository.SqlSugar.Orders
                 }).OrderByDescending(x => x.CreationTime);
             return result;
         }
+
+        /// <summary>
+        /// 扭转列表
+        /// </summary>
+        /// <param name="dto"></param>
+        /// <returns></returns>
+        public ISugarQueryable<OrderVisit> VisitJudgeQuery(VisitJudgeQueryReq dto)
+        {
+            return _orderVisitRepository.Queryable()
+            .Includes(x => x.Order)
+            .Includes(x => x.Employee)
+            .Where(x => x.VisitState == EVisitState.Visited)
+            .WhereIF(!string.IsNullOrEmpty(dto.No), x => x.No == dto.No)
+            .WhereIF(!string.IsNullOrEmpty(dto.Title), x => x.Order.Title.Contains(dto.Title))
+            .WhereIF(!string.IsNullOrEmpty(dto.VisitUserName), x => x.Employee.Name.Contains(dto.VisitUserName))
+            .WhereIF(!string.IsNullOrEmpty(dto.AcceptType), d => d.Order.AcceptTypeCode == dto.AcceptType)//受理类型
+            .WhereIF(!string.IsNullOrEmpty(dto.Hotspot), d => d.Order.HotspotSpliceName != null && d.Order.HotspotSpliceName.Contains(dto.Hotspot))//热点类型
+            .WhereIF(!string.IsNullOrEmpty(dto.OrgId), d => d.Order.CurrentHandleOrgId == dto.OrgId)//接办部门
+            .WhereIF(!string.IsNullOrEmpty(dto.NameOrNo),
+                d => d.Order.AcceptorName.Contains(dto.NameOrNo!) || d.Order.AcceptorStaffNo.Contains(dto.NameOrNo!)) //受理人/坐席
+            .WhereIF(dto.CreationTimeStart.HasValue, d => d.CreationTime >= dto.CreationTimeStart) //受理时间开始
+            .WhereIF(dto.CreationTimeEnd.HasValue, d => d.CreationTime <= dto.CreationTimeEnd) //受理时间结束
+            .WhereIF(dto.ActualHandleTimeStart.HasValue, d => d.Order.ActualHandleTime >= dto.ActualHandleTimeStart) //办结时间开始
+            .WhereIF(dto.ActualHandleTimeEnd.HasValue, d => d.Order.ActualHandleTime <= dto.ActualHandleTimeEnd) //办结时间结束
+            .WhereIF(dto.VisitTimeStart.HasValue, d => d.VisitTime >= dto.VisitTimeStart) //回访开始时间
+            .WhereIF(dto.VisitTimeEnd.HasValue, d => d.VisitTime <= dto.VisitTimeEnd)
+            .WhereIF(dto.IsIng == true, d => d.JudgeState == EJudgeState.Judging)
+            .WhereIF(dto.IsIng == false, d => d.JudgeState != EJudgeState.Judging)
+            .WhereIF(dto.JudgeState != null, d => d.JudgeState == dto.JudgeState)
+            .WhereIF(dto.OrgJudge != null, d => d.OrgJudge == dto.OrgJudge)
+            .WhereIF(dto.SeatJudge != null, d => d.SeatJudge == dto.SeatJudge)
+            .WhereIF(dto.FiledType != null && dto.FiledType == FiledType.CenterFiled, d => d.Order.ProcessType == EProcessType.Zhiban)
+            .WhereIF(dto.FiledType != null && dto.FiledType == FiledType.OrgFiled, d => d.Order.ProcessType == EProcessType.Jiaoban)
+            .WhereIF(!string.IsNullOrEmpty(dto.TransferPhone), x => x.Order.TransferPhone == dto.TransferPhone)
+            .OrderByDescending(x => x.VisitTime);
+        }
     }
 
     public class OrderScreenRepository : BaseRepositoryWorkflow<OrderScreen>, IOrderScreenRepository, IScopeDependency

+ 8 - 0
src/Hotline.Share/Dtos/Order/OrderVisitDto.cs

@@ -115,6 +115,14 @@ namespace Hotline.Share.Dtos.Order
 
     public record VisitJudgeQueryReq : PagedKeywordRequest
     {
+        /// <summary>
+        /// 转接号码
+        /// </summary>
+        public string? TransferPhone { get; set; }
+        /// <summary>
+        /// 归档类型
+        /// </summary>
+        public FiledType? FiledType { get; set; }
         /// <summary>
         /// 工单编号
         /// </summary>

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

@@ -1121,3 +1121,79 @@ public class OrderDataInventoryRep
     public string? FileOpinion { get; set; }
 }
 
+public class OrderVisitJudeStatisticsReq
+{
+    /// <summary>
+    /// 开始时间
+    /// </summary>
+    public DateTime? StartTime { get; set; }
+    /// <summary>
+    /// 结束时间
+    /// </summary>
+    public DateTime? EndTime { get; set; }
+
+
+}
+
+public class OrderVisitJudeStatisticsRep
+{
+    /// <summary>
+    /// 回访员
+    /// </summary>
+    public string EmpName { get; set; }
+
+    public string EmpId { get; set; }
+
+    /// <summary>
+    /// 部门扭转总件
+    /// </summary>
+    public int OrgJudeCount { get; set; }
+
+    /// <summary>
+    /// 部门扭转待审批件
+    /// </summary>
+    public int OrgJudeApprovalingCount { get; set; }
+
+    /// <summary>
+    /// 部门扭转审批成功件
+    /// </summary>
+    public int OrgJudeSuccessCount { get; set; }
+
+    /// <summary>
+    /// 部门扭转审批失败件
+    /// </summary>
+    public int OrgJudeFailCount { get;set; }
+
+    /// <summary>
+    /// 坐席扭转总件
+    /// </summary>
+    public int SeatJudeCount { get; set; }
+
+    /// <summary>
+    /// 坐席扭转待审批件
+    /// </summary>
+    public int SeatJudeApprovalingCount { get; set; }
+
+    /// <summary>
+    /// 坐席扭转审批成功件
+    /// </summary>
+    public int SeatJudeSuccessCount { get; set; }
+
+    /// <summary>
+    /// 坐席扭转审批失败件
+    /// </summary>
+    public int SeatJudeFailCount { get; set; }
+
+}
+
+
+public record OrderVisitJudeDetailReq: PagedRequest
+{
+
+}
+
+
+public class OrderVisitJudeDetailRep
+{
+
+}

+ 9 - 1
src/Hotline/Orders/IOrderRepository.cs

@@ -156,7 +156,15 @@ namespace Hotline.Orders
         /// <param name="dto"></param>
         /// <returns></returns>
         ISugarQueryable<OrderDataInventoryRep> OrderDataInventory(OrderDataInventoryReq dto);
-               
+
+        /// <summary>
+        /// 扭转列表
+        /// </summary>
+        /// <param name="dto"></param>
+        /// <returns></returns>
+        ISugarQueryable<OrderVisit> VisitJudgeQuery(VisitJudgeQueryReq dto);
+
+
     }
 
     public interface IOrderScreenRepository : IRepositoryWorkflow<OrderScreen>