Kaynağa Gözat

数据清单报表

Dun.Jason 8 ay önce
ebeveyn
işleme
991c804d6d

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

@@ -3477,8 +3477,42 @@ namespace Hotline.Api.Controllers.Bi
         [HttpGet("order-data-inventory")]
         public async Task<PagedDto<OrderDataInventoryRep>> OrderDataInventory([FromQuery]OrderDataInventoryReq dto)
         {
-            var (total,items) = await _orderApplication.OrderDataInventory(dto).ToPagedListAsync(dto.PageIndex, dto.PageSize, HttpContext.RequestAborted);
+            var (total,items) = await _orderRepository.OrderDataInventory(dto).ToPagedListAsync(dto.PageIndex, dto.PageSize, HttpContext.RequestAborted);
             return new PagedDto<OrderDataInventoryRep>() { Total = total, Items = items };
         }
-	}
+
+        /// <summary>
+        /// 数据清单导出
+        /// </summary>
+        /// <param name="dto"></param>
+        /// <returns></returns>
+        [HttpPost("order-data-inventory-export")]
+        public async Task<FileStreamResult> OrderDataInventoryExport([FromQuery] ExportExcelDto<OrderDataInventoryReq> dto)
+        {
+            var query = _orderRepository.OrderDataInventory(dto.QueryDto);
+
+            List<OrderDataInventoryRep> orders;
+            if (dto.IsExportAll)
+            {
+                orders = await query.ToListAsync(HttpContext.RequestAborted);
+            }
+            else
+            {
+                var (_, items) = await query.ToPagedListAsync(dto.QueryDto, HttpContext.RequestAborted);
+                orders = items;
+            }
+            var ordersDtos = _mapper.Map<ICollection<OrderDataInventoryRep>>(orders);
+            dynamic? dynamicClass = DynamicClassHelper.CreateDynamicClass(dto.ColumnInfos);
+            var dtos = ordersDtos
+                .Select(stu => _mapper.Map(stu, typeof(OrderDataInventoryRep), dynamicClass))
+                .Cast<object>()
+                .ToList();
+
+            var stream = ExcelHelper.CreateStream(dtos);
+            return ExcelStreamResult(stream, "数据清单明细");
+
+        }
+
+
+    }
 }

+ 0 - 8
src/Hotline.Application/Orders/IOrderApplication.cs

@@ -215,13 +215,5 @@ namespace Hotline.Application.Orders
         /// <returns></returns>
         ISugarQueryable<Order> HotspotAndAcceptTypeStatisticsDetail(HotspotAndAcceptTypeStatisticsDetailReq dto);
 
-        /// <summary>
-        /// 数据清单
-        /// </summary>
-        /// <param name="dto"></param>
-        /// <returns></returns>
-        ISugarQueryable<OrderDataInventoryRep> OrderDataInventory(OrderDataInventoryReq dto);
-
-
     }
 }

+ 1 - 82
src/Hotline.Application/Orders/OrderApplication.cs

@@ -1598,88 +1598,7 @@ public class OrderApplication : IOrderApplication, IScopeDependency
 		return query;
 	}
 
-    /// <summary>
-    /// 数据清单
-    /// </summary>
-    /// <param name="dto"></param>
-    /// <returns></returns>
-    public ISugarQueryable<OrderDataInventoryRep> OrderDataInventory(OrderDataInventoryReq dto)
-    {
-        dto.EndTime = dto.EndTime.AddDays(1).AddSeconds(-1);
-
-        var result = _orderRepository.Queryable()
-            //.Includes(x => x.OrderScreens.OrderByDescending(x => x.CreationTime).FirstOrDefault(),it=>it.Status)
-            //.Includes(x => x.OrderVisits.Where(x => x.VisitState == EVisitState.Visited).FirstOrDefault(),it=>it.OrderVisitDetails)
-            .Where(x => x.CreationTime >= dto.StartTime) //开始时间
-            .Where(x => x.CreationTime <= dto.EndTime)//开始时间
-            .WhereIF(!string.IsNullOrEmpty(dto.No), x => x.No == dto.No) //工单编号
-            .WhereIF(!string.IsNullOrEmpty(dto.Title), x => x.Title.Contains(dto.Title)) //工单标题
-            .WhereIF(dto.OrderStatus.HasValue, x => x.Status == dto.OrderStatus) //工单状态
-            .WhereIF(!string.IsNullOrEmpty(dto.Channel), x => x.SourceChannelCode == dto.Channel) //来源渠道
-            .WhereIF(!string.IsNullOrEmpty(dto.TransferPhone), x => x.TransferPhone == dto.TransferPhone!) //转接号码
-            .WhereIF(!string.IsNullOrEmpty(dto.ActualHandleStepName), x => x.ActualHandleStepName.Contains(dto.ActualHandleStepName)) //当前节点
-            .WhereIF(dto.ScreenStatus.HasValue, x => x.OrderScreens.Any(x => x.Status == dto.ScreenStatus)) //甄别状态
-            .WhereIF(!string.IsNullOrEmpty(dto.ProvinceNo), x => x.ProvinceNo == dto.ProvinceNo)//省工单编号
-            .WhereIF(dto.ExpiredTimeStart.HasValue, x => x.ExpiredTime >= dto.ExpiredTimeStart) //期满时间开始
-            .WhereIF(dto.ExpiredTimeEnd.HasValue, x => x.ExpiredTime <= dto.ExpiredTimeEnd.Value.AddDays(1).AddSeconds(-1)) //期满时间结束
-            .WhereIF(!string.IsNullOrEmpty(dto.OrgLevelOneName), x => x.OrgLevelOneName.Contains(dto.OrgLevelOneName))//一级部门名称
-            .WhereIF(!string.IsNullOrEmpty(dto.OrgLevelTwoName), x => x.OrgLevelTwoName.Contains(dto.OrgLevelTwoName)) //二级部门名称
-            .WhereIF(!string.IsNullOrEmpty(dto.ActualHandleOrgName), x => x.ActualHandleOrgName.Contains(dto.ActualHandleOrgName)) //接办部门
-            .WhereIF(dto.FiledTimeStart.HasValue, x => x.FiledTime >= dto.FiledTimeStart) //办结时间开始
-            .WhereIF(dto.FiledTimeEnd.HasValue, x => x.FiledTime <= dto.FiledTimeEnd.Value.AddDays(1).AddSeconds(-1)) //办结时间结束
-            .WhereIF(!string.IsNullOrEmpty(dto.AcceptType), x => x.AcceptTypeCode == dto.AcceptType)//受理类型
-            .WhereIF(!string.IsNullOrEmpty(dto.Hotspot), x => x.HotspotSpliceName != null && x.HotspotSpliceName.Contains(dto.Hotspot)) //热点分类
-            .WhereIF(!string.IsNullOrEmpty(dto.AreaCode), x => x.AreaCode == dto.AreaCode)//区域
-            .WhereIF(!string.IsNullOrEmpty(dto.NameOrNo), x => x.AcceptorName == dto.NameOrNo! || x.AcceptorStaffNo == dto.NameOrNo!) //受理人/坐席
-            .WhereIF(!string.IsNullOrEmpty(dto.FromName), x => x.FromName.Contains(dto.FromName)) //来电人姓名
-            .WhereIF(!string.IsNullOrEmpty(dto.FromPhone), x => x.FromPhone == dto.FromPhone) //来电号码
-            .WhereIF(!string.IsNullOrEmpty(dto.PhoneNo), x => x.Contact == dto.PhoneNo!) //联系电话
-            .WhereIF(dto.IdentityType.HasValue, x => x.IdentityType == dto.IdentityType) //来电主体
-            .WhereIF(dto.FromGender.HasValue, x => x.FromGender == dto.FromGender) //来电性别
-            .WhereIF(!string.IsNullOrEmpty(dto.PushTypeCode), x => x.PushTypeCode == dto.PushTypeCode)//推送分类
-            .Select(x => new OrderDataInventoryRep()
-            {
-                OrderStatus = x.Status,
-                ActualHandleTime = x.ActualHandleTime,
-                NearlyExpiredTime = x.NearlyExpiredTime,
-                SourceChannel = x.SourceChannel,
-                TransferPhone = x.TransferPhone,
-                ActualHandleStepName = x.ActualHandleStepName,
-                ReTransactNum = x.ReTransactNum,
-                //TODO 甄别状态
-                //OrderScreenStatus = x.OrderScreens.FirstOrDefault().Status,
-                No = x.No,
-                ProvinceNo = x.ProvinceNo,
-                CreationTime = x.CreationTime,
-                Title = x.Title,
-                ExpiredTime = x.ExpiredTime,
-                OrgLevelOneName = x.OrgLevelOneName,
-                OrgLevelTwoName = x.OrgLevelTwoName,
-                ActualHandleOrgName = x.ActualHandleOrgName,
-                FiledTime = x.FiledTime,
-                AcceptType = x.AcceptType,
-                HotspotName = x.HotspotName,
-                HotspotSpliceName = x.HotspotSpliceName,
-                AreaName = SqlFunc.IIF(string.IsNullOrEmpty(x.Town)==false,x.Town,SqlFunc.IIF(string.IsNullOrEmpty(x.County)==false,x.County,x.City)),
-                FullAreaName = x.FullAddress,
-                AcceptorName = x.AcceptorName,
-                FromName = x.FromName,
-                Contact = x.Contact,
-                FromPhone = x.FromPhone,
-                Address = x.Street,
-                IdentityType = x.IdentityType,
-                FromGender = x.FromGender,
-                //坐席评价
-                //SeatEvaluate = x.OrderVisits.FirstOrDefault().OrderVisitDetails.Where(x=>x.VisitTarget == EVisitTarget.Seat).FirstOrDefault().SeatEvaluate,
-                //TODO 办结结果
-                //OrgProcessingResults = x.OrderVisits.FirstOrDefault().NowEvaluate.Value,
-                PushType = x.PushType,
-                Content = x.Content,
-                ActualOpinion = x.ActualOpinion,
-                FileOpinion = x.FileOpinion,
-            }).OrderByDescending(x => x.CreationTime);
-        return result;
-    }
+    
 
 
     #region private

+ 88 - 0
src/Hotline.Repository.SqlSugar/Orders/OrderRepository.cs

@@ -1049,6 +1049,94 @@ namespace Hotline.Repository.SqlSugar.Orders
         {
             return Db.UnionAll(t1, t2).Select(it => new SelectOrderId { Id = it.Id }).MergeTable();
         }
+
+
+        /// <summary>
+        /// 数据清单
+        /// </summary>
+        /// <param name="dto"></param>
+        /// <returns></returns>
+        public ISugarQueryable<OrderDataInventoryRep> OrderDataInventory(OrderDataInventoryReq dto)
+        {
+            dto.EndTime = dto.EndTime.AddDays(1).AddSeconds(-1);
+
+            var result = Db.Queryable<Order>()
+                //.Includes(x => x.OrderScreens.OrderByDescending(x => x.CreationTime).FirstOrDefault(),it=>it.Status)
+                //.Includes(x => x.OrderVisits.Where(x => x.VisitState == EVisitState.Visited).FirstOrDefault(),it=>it.OrderVisitDetails)
+                .Where(x => x.CreationTime >= dto.StartTime) //开始时间
+                .Where(x => x.CreationTime <= dto.EndTime)//开始时间
+                .WhereIF(!string.IsNullOrEmpty(dto.No), x => x.No == dto.No) //工单编号
+                .WhereIF(!string.IsNullOrEmpty(dto.Title), x => x.Title.Contains(dto.Title)) //工单标题
+                .WhereIF(dto.OrderStatus.HasValue, x => x.Status == dto.OrderStatus) //工单状态
+                .WhereIF(!string.IsNullOrEmpty(dto.Channel), x => x.SourceChannelCode == dto.Channel) //来源渠道
+                .WhereIF(!string.IsNullOrEmpty(dto.TransferPhone), x => x.TransferPhone == dto.TransferPhone!) //转接号码
+                .WhereIF(!string.IsNullOrEmpty(dto.ActualHandleStepName), x => x.ActualHandleStepName.Contains(dto.ActualHandleStepName)) //当前节点
+                .WhereIF(dto.ScreenStatus.HasValue, x => x.OrderScreens.Any(x => x.Status == dto.ScreenStatus)) //甄别状态
+                .WhereIF(!string.IsNullOrEmpty(dto.ProvinceNo), x => x.ProvinceNo == dto.ProvinceNo)//省工单编号
+                .WhereIF(dto.ExpiredTimeStart.HasValue, x => x.ExpiredTime >= dto.ExpiredTimeStart) //期满时间开始
+                .WhereIF(dto.ExpiredTimeEnd.HasValue, x => x.ExpiredTime <= dto.ExpiredTimeEnd.Value.AddDays(1).AddSeconds(-1)) //期满时间结束
+                .WhereIF(!string.IsNullOrEmpty(dto.OrgLevelOneName), x => x.OrgLevelOneName.Contains(dto.OrgLevelOneName))//一级部门名称
+                .WhereIF(!string.IsNullOrEmpty(dto.OrgLevelTwoName), x => x.OrgLevelTwoName.Contains(dto.OrgLevelTwoName)) //二级部门名称
+                .WhereIF(!string.IsNullOrEmpty(dto.ActualHandleOrgName), x => x.ActualHandleOrgName.Contains(dto.ActualHandleOrgName)) //接办部门
+                .WhereIF(dto.FiledTimeStart.HasValue, x => x.FiledTime >= dto.FiledTimeStart) //办结时间开始
+                .WhereIF(dto.FiledTimeEnd.HasValue, x => x.FiledTime <= dto.FiledTimeEnd.Value.AddDays(1).AddSeconds(-1)) //办结时间结束
+                .WhereIF(!string.IsNullOrEmpty(dto.AcceptType), x => x.AcceptTypeCode == dto.AcceptType)//受理类型
+                .WhereIF(!string.IsNullOrEmpty(dto.Hotspot), x => x.HotspotSpliceName != null && x.HotspotSpliceName.Contains(dto.Hotspot)) //热点分类
+                .WhereIF(!string.IsNullOrEmpty(dto.AreaCode), x => x.AreaCode == dto.AreaCode)//区域
+                .WhereIF(!string.IsNullOrEmpty(dto.NameOrNo), x => x.AcceptorName == dto.NameOrNo! || x.AcceptorStaffNo == dto.NameOrNo!) //受理人/坐席
+                .WhereIF(!string.IsNullOrEmpty(dto.FromName), x => x.FromName.Contains(dto.FromName)) //来电人姓名
+                .WhereIF(!string.IsNullOrEmpty(dto.FromPhone), x => x.FromPhone == dto.FromPhone) //来电号码
+                .WhereIF(!string.IsNullOrEmpty(dto.PhoneNo), x => x.Contact == dto.PhoneNo!) //联系电话
+                .WhereIF(dto.IdentityType.HasValue, x => x.IdentityType == dto.IdentityType) //来电主体
+                .WhereIF(dto.FromGender.HasValue, x => x.FromGender == dto.FromGender) //来电性别
+                .WhereIF(!string.IsNullOrEmpty(dto.PushTypeCode), x => x.PushTypeCode == dto.PushTypeCode)//推送分类
+                .Select(x => new OrderDataInventoryRep()
+                {
+                    OrderStatus = x.Status,
+                    ActualHandleTime = x.ActualHandleTime,
+                    NearlyExpiredTime = x.NearlyExpiredTime,
+                    SourceChannel = x.SourceChannel,
+                    TransferPhone = x.TransferPhone,
+                    ActualHandleStepName = x.ActualHandleStepName,
+                    ReTransactNum = x.ReTransactNum,
+                    //TODO 甄别状态
+                    OrderScreenStatus = SqlFunc.Subqueryable<OrderScreen>().Where(q=>q.OrderId == x.Id).OrderByDesc(q=>q.CreationTime).Select(q=>q.Status), //x.OrderScreens.FirstOrDefault().Status,
+                    No = x.No,
+                    ProvinceNo = x.ProvinceNo,
+                    CreationTime = x.CreationTime,
+                    Title = x.Title,
+                    ExpiredTime = x.ExpiredTime,
+                    OrgLevelOneName = x.OrgLevelOneName,
+                    OrgLevelTwoName = x.OrgLevelTwoName,
+                    ActualHandleOrgName = x.ActualHandleOrgName,
+                    FiledTime = x.FiledTime,
+                    AcceptType = x.AcceptType,
+                    HotspotName = x.HotspotName,
+                    HotspotSpliceName = x.HotspotSpliceName,
+                    AreaName = SqlFunc.IIF(string.IsNullOrEmpty(x.Town) == false, x.Town, SqlFunc.IIF(string.IsNullOrEmpty(x.County) == false, x.County, x.City)),
+                    FullAreaName = x.FullAddress,
+                    AcceptorName = x.AcceptorName,
+                    FromName = x.FromName,
+                    Contact = x.Contact,
+                    FromPhone = x.FromPhone,
+                    Address = x.Street,
+                    IdentityType = x.IdentityType,
+                    FromGender = x.FromGender,
+                    //坐席评价
+                    SeatEvaluate = SqlFunc.Subqueryable<OrderVisitDetail>()
+                          .Where(w => w.VisitId == SqlFunc.Subqueryable<OrderVisit>().Where(q => q.OrderId == x.Id && q.VisitState == EVisitState.Visited).Select(q => q.Id) && w.VisitTarget == EVisitTarget.Seat)
+                          .Select(w =>w.SeatEvaluate),
+                    //TODO 办结结果
+                    OrgProcessingResults = SqlFunc.Subqueryable<OrderVisitDetail>()
+                          .Where(w => w.VisitId == SqlFunc.Subqueryable<OrderVisit>().Where(q => q.OrderId == x.Id && q.VisitState == EVisitState.Visited).Select(q => q.Id) && w.VisitTarget == EVisitTarget.Org)
+                          .Select(w =>SqlFunc.JsonField(w.OrgProcessingResults,"Value")),
+                    PushType = x.PushType,
+                    Content = x.Content,
+                    ActualOpinion = x.ActualOpinion,
+                    FileOpinion = x.FileOpinion,
+                }).OrderByDescending(x => x.CreationTime);
+            return result;
+        }
     }
 
     public class OrderScreenRepository : BaseRepositoryWorkflow<OrderScreen>, IOrderScreenRepository, IScopeDependency

+ 5 - 1
src/Hotline.Share/Requests/PagedKeywordRequest.cs

@@ -937,7 +937,9 @@ public class OrderDataInventoryRep
     public int? ReTransactNum { get; set; }
 
     //甄别状态
-    public EScreenStatus? OrderScreenStatus { get; set; } 
+    public EScreenStatus? OrderScreenStatus { get; set; }
+
+    public string? OrderScreenStatusText => OrderScreenStatus?.GetDescription();
 
 
     /// <summary>
@@ -1052,6 +1054,8 @@ public class OrderDataInventoryRep
     //坐席评价
     public ESeatEvaluate? SeatEvaluate { get; set; }
 
+    public string? SeatEvaluateText => SeatEvaluate?.GetDescription();
+
     //办理结果
     public string? OrgProcessingResults { get; set; }
 

+ 7 - 0
src/Hotline/Orders/IOrderRepository.cs

@@ -142,6 +142,13 @@ namespace Hotline.Orders
         /// <param name="dto"></param>
         /// <returns></returns>
         ISugarQueryable<HotspotAndAreaStatisticsDetailDto> AcceptTypeStatisticsByDateDetail(AcceptTypeStatisticsByDateDetailReq dto);
+
+        /// <summary>
+        /// 数据清单
+        /// </summary>
+        /// <param name="dto"></param>
+        /// <returns></returns>
+        ISugarQueryable<OrderDataInventoryRep> OrderDataInventory(OrderDataInventoryReq dto);
     }
 
     public interface IOrderScreenRepository : IRepositoryWorkflow<OrderScreen>