Bladeren bron

任务 326 市州通用-延期列表增加导出功能

tangjiang 2 maanden geleden
bovenliggende
commit
69ab2399eb

+ 85 - 68
src/Hotline.Api/Controllers/OrderController.cs

@@ -2278,79 +2278,96 @@ public class OrderController : BaseController
     [HttpGet("delay")]
     public async Task<PagedDto<OrderDelayDto>> DelayList([FromQuery] DelayListDto dto)
     {
-        var isAdmin = _orderDomainService.IsCheckAdmin();
-        var query = _orderDelayRepository.Queryable();
-        if (!isAdmin)
-        {
-            query.Where(d => SqlFunc.Subqueryable<WorkflowTrace>()
-                .Where(step => step.ExternalId == d.Id &&
-                               ((step.FlowAssignType == EFlowAssignType.User && !string.IsNullOrEmpty(step.HandlerId) &&
-                                 step.HandlerId == _sessionContext.RequiredUserId) ||
-                                (step.FlowAssignType == EFlowAssignType.Org && !string.IsNullOrEmpty(step.HandlerOrgId) &&
-                                 step.HandlerOrgId == _sessionContext.RequiredOrgId) ||
-                                (step.FlowAssignType == EFlowAssignType.Role && !string.IsNullOrEmpty(step.RoleId) &&
-                                 _sessionContext.Roles.Contains(step.RoleId)) ||
-                                (step.FlowAssignType == EFlowAssignType.OrgAndRole && !string.IsNullOrEmpty(step.RoleId) &&
-                                 _sessionContext.Roles.Contains(step.RoleId) && !string.IsNullOrEmpty(step.HandlerOrgId) &&
-                                 step.HandlerOrgId == _sessionContext.RequiredOrgId)
-                               ))
-                .Any());
-            if (!_sessionContext.OrgIsCenter)
-            {
-                query.Where(d => d.AutomaticDelayNum == 0 || d.AutomaticDelayNum == null);
-            }
-        }
-
-        var (total, items) = await query
-            .Includes(d => d.Order)
-            .Includes(d => d.Workflow)
-            .WhereIF(!string.IsNullOrEmpty(dto.Keyword),
-                d => d.Order.Title.Contains(dto.Keyword!) || d.Order.No.Contains(dto.Keyword!))
-            .WhereIF(dto.IsApply == true, d => d.DelayState != EDelayState.Examining)
-            .WhereIF(dto.IsApply == false, d => d.DelayState == EDelayState.Examining)
-            .WhereIF(dto.DelayState != null, d => d.DelayState == dto.DelayState)
-            .WhereIF(dto.DataScope is 1, d => d.CreatorId == _sessionContext.RequiredUserId)
-            .WhereIF(dto.QueryDelayState is EQueryDelayState.Examining, d => d.DelayState == EDelayState.Examining)
-            .WhereIF(dto.QueryDelayState is EQueryDelayState.Pass, d => d.DelayState == EDelayState.Pass)
-            .WhereIF(dto.QueryDelayState is EQueryDelayState.NoPass, d => d.DelayState == EDelayState.NoPass)
-            .WhereIF(!string.IsNullOrEmpty(dto.CurrentStepName),
-                d => !SqlFunc.IsNullOrEmpty(d.WorkflowId) && d.Workflow.ActualHandleStepName == dto.CurrentStepName) //当前节点
-            .WhereIF(!string.IsNullOrEmpty(dto.ActualHandlerName),
-                d => !SqlFunc.IsNullOrEmpty(d.WorkflowId) && d.Workflow.ActualHandlerName == dto.ActualHandlerName) // 审批人
-            .WhereIF(!string.IsNullOrEmpty(dto.OrgLevelOneName), d => d.Order.OrgLevelOneName == dto.OrgLevelOneName) //一级部门
-            .WhereIF(dto.StartCreationTime.HasValue && dto.EndCreationTime.HasValue,
-                d => d.CreationTime >= dto.StartCreationTime && d.CreationTime <= dto.EndCreationTime) // 申请时间
-            .OrderByDescending(d => d.ApplyDelayTime)
+        var (total, items) = await _orderApplication.DelayList(dto)
             .ToPagedListAsync(dto.PageIndex, dto.PageSize, HttpContext.RequestAborted);
 
         return new PagedDto<OrderDelayDto>(total, _mapper.Map<IReadOnlyList<OrderDelayDto>>(items));
     }
 
     /// <summary>
-    /// 延期列表
+    /// 延期列表--导出
+    /// </summary>
+    /// <param name="dto"></param>
+    /// <returns></returns>
+    [HttpPost("delay/export")]
+    public async Task<FileStreamResult> ExportDelayList([FromBody] ExportExcelDto<DelayListDto> dto)
+    {
+        var query = _orderApplication.DelayList(dto.QueryDto);
+        List<OrderDelay> 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<OrderDelayDto>>(orders);
+
+        dynamic? dynamicClass = DynamicClassHelper.CreateDynamicClass(dto.ColumnInfos);
+
+        var dtos = orderDtos
+            .Select(stu => _mapper.Map(stu, typeof(OrderDelayDto), dynamicClass))
+            .Cast<object>()
+            .ToList();
+
+        var stream = ExcelHelper.CreateStream(dtos);
+        var excelTitle = "延期列表数据";
+
+        return ExcelStreamResult(stream, excelTitle);
+    }
+
+
+    /// <summary>
+    /// 延期待审批
     /// </summary>
     /// <returns></returns>
     [HttpGet("wait_delay")]
     public async Task<PagedDto<OrderDelayDto>> WaitDelayList([FromQuery] DelayListDto dto)
     {
-        var isAdmin = _orderDomainService.IsCheckAdmin();
-        var isHandled = dto.IsApply.HasValue && dto.IsApply.Value;
-        var (total, items) = await _orderDelayRepository
-            .Queryable(hasHandled: isHandled, isAdmin: isAdmin)
-            .Includes(d => d.Order)
-            .Includes(d => d.Workflow)
-            .WhereIF(!string.IsNullOrEmpty(dto.Keyword),
-                d => d.Order.Title.Contains(dto.Keyword!) || d.No.Contains(dto.Keyword!))
-            //.WhereIF(dto.IsApply == true, d => d.DelayState != EDelayState.Examining)
-            .WhereIF(dto.IsApply == false, d => d.DelayState == EDelayState.Examining)
-            //.WhereIF(dto.DelayState != null, x => x.DelayState == dto.DelayState)
-            //.Where(x=>x.DelayState == EDelayState.Examining)
-            .OrderByDescending(d => d.ApplyDelayTime)
-            .ToPagedListAsync(dto.PageIndex, dto.PageSize, HttpContext.RequestAborted);
+        var (total, items) = await _orderApplication.WaitDelayList(dto)
+             .ToPagedListAsync(dto.PageIndex, dto.PageSize, HttpContext.RequestAborted);
 
         return new PagedDto<OrderDelayDto>(total, _mapper.Map<IReadOnlyList<OrderDelayDto>>(items));
     }
 
+    /// <summary>
+    /// 延期待审批--导出
+    /// </summary>
+    /// <param name="dto"></param>
+    /// <returns></returns>
+    [HttpPost("wait_delay/export")]
+    public async Task<FileStreamResult> ExportWaitDelayList([FromBody] ExportExcelDto<DelayListDto> dto)
+    {
+        var query = _orderApplication.WaitDelayList(dto.QueryDto);
+        List<OrderDelay> 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<OrderDelayDto>>(orders);
+
+        dynamic? dynamicClass = DynamicClassHelper.CreateDynamicClass(dto.ColumnInfos);
+
+        var dtos = orderDtos
+            .Select(stu => _mapper.Map(stu, typeof(OrderDelayDto), dynamicClass))
+            .Cast<object>()
+            .ToList();
+
+        var stream = ExcelHelper.CreateStream(dtos);
+        var excelTitle = "延期待审批数据";
+
+        return ExcelStreamResult(stream, excelTitle);
+    }
+
     /// <summary>
     /// 延期详情
     /// </summary>
@@ -2591,15 +2608,15 @@ public class OrderController : BaseController
         setting = _systemSettingCacheManager.GetSetting(SettingConstants.ScreenApplyEndTime);
         if (int.Parse(setting?.SettingValue[0]) > 0)
         {
-			var visitDetail = await _orderVisitedDetailRepository.GetAsync(dto.Data.VisitDetailId, HttpContext.RequestAborted);
-			if (visitDetail.ScreenByEndTime.HasValue)
-			{
-				if (DateTime.Now > visitDetail.ScreenByEndTime && !_sessionContext.OrgIsCenter)
-				{
-					throw UserFriendlyException.SameMessage("超过2个工作日不能申请甄别,不能申请");
-				}
-			}
-		}
+            var visitDetail = await _orderVisitedDetailRepository.GetAsync(dto.Data.VisitDetailId, HttpContext.RequestAborted);
+            if (visitDetail.ScreenByEndTime.HasValue)
+            {
+                if (DateTime.Now > visitDetail.ScreenByEndTime && !_sessionContext.OrgIsCenter)
+                {
+                    throw UserFriendlyException.SameMessage("超过2个工作日不能申请甄别,不能申请");
+                }
+            }
+        }
 
         var order = await _orderRepository.GetAsync(dto.Data.OrderId, HttpContext.RequestAborted);
         if (order.IsProvince)
@@ -5454,7 +5471,7 @@ public class OrderController : BaseController
             Status = order.Status,
             TraceId = currentStep.Id,
             OrderExpiredTime = order.ExpiredTime
-		};
+        };
         audit.InitId();
         if (dto.Files.Any())
             audit.FileJson = await _fileRepository.AddFileAsync(dto.Files, audit.Id, "", HttpContext.RequestAborted);

+ 17 - 3
src/Hotline.Application/Orders/IOrderApplication.cs

@@ -2,6 +2,7 @@
 using Hotline.FlowEngine.Definitions;
 using Hotline.FlowEngine.Workflows;
 using Hotline.Orders;
+using Hotline.Repository.SqlSugar.Orders;
 using Hotline.Settings;
 using Hotline.Share.Dtos;
 using Hotline.Share.Dtos.DataSharing.PusherHotlineDto;
@@ -9,6 +10,8 @@ using Hotline.Share.Dtos.FlowEngine;
 using Hotline.Share.Dtos.FlowEngine.Workflow;
 using Hotline.Share.Dtos.Order;
 using Hotline.Share.Dtos.Order.Publish;
+using Hotline.Share.Enums.FlowEngine;
+using Hotline.Share.Enums.Order;
 using Hotline.Share.Enums.Settings;
 using Hotline.Share.Requests;
 using SqlSugar;
@@ -413,7 +416,7 @@ namespace Hotline.Application.Orders
         /// </summary>
         Task<StepAssignInfo?> GetOrderPreviousAssignInfoAsync(Workflow workflow, StepDefine prevStepDefine, WorkflowStep prevStep,
             CancellationToken cancellationToken);
-        
+
         /// <summary>
         /// 查询特提操作目标节点的指派对象
         /// </summary>
@@ -432,7 +435,7 @@ namespace Hotline.Application.Orders
         /// <param name="dto"></param>
         /// <returns></returns>
         ISugarQueryable<ExtendedSendBackVo> ExtendedSendBackStatistics(PagedKeywordRequest dto);
-        
+
         /// <summary>
         /// 超期退回统计明细
         /// </summary>
@@ -440,5 +443,16 @@ namespace Hotline.Application.Orders
         /// <returns></returns>
         ISugarQueryable<OrderSendBackAudit> ExtendedSendBackDetail(ExtendedSendBackRequest dto);
 
-	}
+        /// <summary>
+        /// 延期列表
+        /// </summary>
+        /// <returns></returns>
+        ISugarQueryable<OrderDelay> DelayList(DelayListDto dto);
+
+        /// <summary>
+        /// 延期列表
+        /// </summary>
+        /// <returns></returns>
+        ISugarQueryable<OrderDelay> WaitDelayList(DelayListDto dto);
+    }
 }

+ 88 - 8
src/Hotline.Application/Orders/OrderApplication.cs

@@ -4251,7 +4251,7 @@ public class OrderApplication : IOrderApplication, IScopeDependency
             _mapper.Map(expiredTimeConfig, order);
             //await _orderRepository.UpdateAsync(order, cancellationToken);
 
-           //特提(撤回至发起)
+            //特提(撤回至发起)
             if (!string.IsNullOrEmpty(order.WorkflowId))
             {
                 // FlowStepHandler? handler = null;
@@ -4991,21 +4991,23 @@ public class OrderApplication : IOrderApplication, IScopeDependency
     /// <param name="dto"></param>
     /// <returns></returns>
 
-    public ISugarQueryable<ExtendedSendBackVo> ExtendedSendBackStatistics(PagedKeywordRequest dto) {
+    public ISugarQueryable<ExtendedSendBackVo> ExtendedSendBackStatistics(PagedKeywordRequest dto)
+    {
 
         var query = _orderSendBackAuditRepository.Queryable()
             .Where(x => x.ApplyOrgId.Length == 6)
             .WhereIF(dto.StartTime.HasValue && dto.EndTime.HasValue, x => x.CreationTime >= dto.StartTime && x.CreationTime <= dto.EndTime)
-            .GroupBy(x => new { x.ApplyOrgId,x.ApplyOrgName})
-            .Select(x => new ExtendedSendBackVo() {
+            .GroupBy(x => new { x.ApplyOrgId, x.ApplyOrgName })
+            .Select(x => new ExtendedSendBackVo()
+            {
 
                 OrgId = x.ApplyOrgId,
                 OrgName = x.ApplyOrgName,
                 TotalNum = SqlFunc.AggregateSum(1),
                 PassNum = SqlFunc.AggregateSum(SqlFunc.IIF(x.State == ESendBackAuditState.End, 1, 0)),
-				NoPassNum = SqlFunc.AggregateSum(SqlFunc.IIF(x.State == ESendBackAuditState.Refuse, 1, 0)),
-				AuditNum = SqlFunc.AggregateSum(SqlFunc.IIF(x.State == ESendBackAuditState.Apply, 1, 0))
-			});
+                NoPassNum = SqlFunc.AggregateSum(SqlFunc.IIF(x.State == ESendBackAuditState.Refuse, 1, 0)),
+                AuditNum = SqlFunc.AggregateSum(SqlFunc.IIF(x.State == ESendBackAuditState.Apply, 1, 0))
+            });
         return query;
     }
 
@@ -5049,5 +5051,83 @@ public class OrderApplication : IOrderApplication, IScopeDependency
             ;
         return query;
 
-	}
+    }
+
+
+    /// <summary>
+    /// 延期列表
+    /// </summary>
+    /// <returns></returns>
+    public ISugarQueryable<OrderDelay> DelayList(DelayListDto dto)
+    {
+        var isAdmin = _orderDomainService.IsCheckAdmin();
+        var query = _orderDelayRepository.Queryable();
+        if (!isAdmin)
+        {
+            query.Where(d => SqlFunc.Subqueryable<WorkflowTrace>()
+                .Where(step => step.ExternalId == d.Id &&
+                               ((step.FlowAssignType == EFlowAssignType.User && !string.IsNullOrEmpty(step.HandlerId) &&
+                                 step.HandlerId == _sessionContext.RequiredUserId) ||
+                                (step.FlowAssignType == EFlowAssignType.Org && !string.IsNullOrEmpty(step.HandlerOrgId) &&
+                                 step.HandlerOrgId == _sessionContext.RequiredOrgId) ||
+                                (step.FlowAssignType == EFlowAssignType.Role && !string.IsNullOrEmpty(step.RoleId) &&
+                                 _sessionContext.Roles.Contains(step.RoleId)) ||
+                                (step.FlowAssignType == EFlowAssignType.OrgAndRole && !string.IsNullOrEmpty(step.RoleId) &&
+                                 _sessionContext.Roles.Contains(step.RoleId) && !string.IsNullOrEmpty(step.HandlerOrgId) &&
+                                 step.HandlerOrgId == _sessionContext.RequiredOrgId)
+                               ))
+                .Any());
+            if (!_sessionContext.OrgIsCenter)
+            {
+                query.Where(d => d.AutomaticDelayNum == 0 || d.AutomaticDelayNum == null);
+            }
+        }
+
+        return query
+            .Includes(d => d.Order)
+            .Includes(d => d.Workflow)
+            .WhereIF(!string.IsNullOrEmpty(dto.Keyword),
+                d => d.Order.Title.Contains(dto.Keyword!) || d.Order.No.Contains(dto.Keyword!))
+            .WhereIF(dto.IsApply == true, d => d.DelayState != EDelayState.Examining)
+            .WhereIF(dto.IsApply == false, d => d.DelayState == EDelayState.Examining)
+            .WhereIF(dto.DelayState != null, d => d.DelayState == dto.DelayState)
+            .WhereIF(dto.DataScope is 1, d => d.CreatorId == _sessionContext.RequiredUserId)
+            .WhereIF(dto.QueryDelayState is EQueryDelayState.Examining, d => d.DelayState == EDelayState.Examining)
+            .WhereIF(dto.QueryDelayState is EQueryDelayState.Pass, d => d.DelayState == EDelayState.Pass)
+            .WhereIF(dto.QueryDelayState is EQueryDelayState.NoPass, d => d.DelayState == EDelayState.NoPass)
+            .WhereIF(!string.IsNullOrEmpty(dto.CurrentStepName),
+                d => !SqlFunc.IsNullOrEmpty(d.WorkflowId) && d.Workflow.ActualHandleStepName == dto.CurrentStepName) //当前节点
+            .WhereIF(!string.IsNullOrEmpty(dto.ActualHandlerName),
+                d => !SqlFunc.IsNullOrEmpty(d.WorkflowId) && d.Workflow.ActualHandlerName == dto.ActualHandlerName) // 审批人
+            .WhereIF(!string.IsNullOrEmpty(dto.OrgLevelOneName), d => d.Order.OrgLevelOneName == dto.OrgLevelOneName) //一级部门
+            .WhereIF(dto.StartCreationTime.HasValue && dto.EndCreationTime.HasValue,
+                d => d.CreationTime >= dto.StartCreationTime && d.CreationTime <= dto.EndCreationTime) // 申请时间
+            .OrderByDescending(d => d.ApplyDelayTime)
+           ;
+
+    }
+
+    /// <summary>
+    /// 延期列表
+    /// </summary>
+    /// <returns></returns>
+    public ISugarQueryable<OrderDelay> WaitDelayList(DelayListDto dto)
+    {
+        var isAdmin = _orderDomainService.IsCheckAdmin();
+        var isHandled = dto.IsApply.HasValue && dto.IsApply.Value;
+        var query = _orderDelayRepository
+            .Queryable(hasHandled: isHandled, isAdmin: isAdmin)
+            .Includes(d => d.Order)
+            .Includes(d => d.Workflow)
+            .WhereIF(!string.IsNullOrEmpty(dto.Keyword),
+                d => d.Order.Title.Contains(dto.Keyword!) || d.No.Contains(dto.Keyword!))
+            //.WhereIF(dto.IsApply == true, d => d.DelayState != EDelayState.Examining)
+            .WhereIF(dto.IsApply == false, d => d.DelayState == EDelayState.Examining)
+            //.WhereIF(dto.DelayState != null, x => x.DelayState == dto.DelayState)
+            //.Where(x=>x.DelayState == EDelayState.Examining)
+            .OrderByDescending(d => d.ApplyDelayTime)
+           ;
+
+        return query;
+    }
 }