xf 5 місяців тому
батько
коміт
79251896b0

+ 16 - 0
src/Hotline.Api/Controllers/OrderController.cs

@@ -3891,6 +3891,22 @@ public class OrderController : BaseController
         await _orderDomainService.TriggerAverageOrder(HttpContext.RequestAborted);
     }
 
+    /// <summary>
+    /// 批量归档
+    /// </summary>
+    [HttpPost("batch-file")]
+    public async Task BatchFile([FromBody]OrderBatchFileDto dto)
+    {
+        var orders = await _orderRepository.Queryable()
+            .Where(d => dto.OrderIds.Contains(d.Id))
+            .ToListAsync(HttpContext.RequestAborted);
+        foreach (var order in orders)
+        {
+            await _workflowDomainService.JumpToEndAsync(_sessionContext, order.WorkflowId,dto.Opinion,dto.Files,
+                order.ExpiredTime, cancellationToken: HttpContext.RequestAborted);
+        }
+    }
+
     #endregion
 
     #region 工单待办

+ 1 - 1
src/Hotline.Api/Controllers/OrderRevocationController.cs

@@ -156,7 +156,7 @@ namespace Hotline.Api.Controllers
                             }
                             else
                             {
-                                await _workflowApplication.JumpToEndAsync(_sessionContext, order.WorkflowId, dto.RevocationReason,
+                                await _workflowDomainService.JumpToEndAsync(_sessionContext, order.WorkflowId, dto.RevocationReason,
                                     null, order.ExpiredTime, cancellationToken: HttpContext.RequestAborted);
                             }
 

+ 13 - 0
src/Hotline.Application.Contracts/Validators/Order/OrderBatchFileDtoValidator.cs

@@ -0,0 +1,13 @@
+using FluentValidation;
+using Hotline.Share.Dtos.Order.Handle;
+
+namespace Hotline.Application.Contracts.Validators.Order;
+
+public class OrderBatchFileDtoValidator:AbstractValidator<OrderBatchFileDto>
+{
+    public OrderBatchFileDtoValidator()
+    {
+        RuleFor(d => d.OrderIds).NotEmpty();
+        RuleFor(d=>d.Opinion).NotEmpty();
+    }
+}

+ 0 - 6
src/Hotline.Application/FlowEngine/IWorkflowApplication.cs

@@ -63,12 +63,6 @@ namespace Hotline.Application.FlowEngine
         Task HandleToEndAsync(string workflowId, string opinion, List<FileDto> files,
             EReviewResult reviewResult = EReviewResult.Unknown, CancellationToken cancellationToken = default);
 
-        /// <summary>
-        /// 跳转至结束节点(无视流程模板配置以及当前办理对象)
-        /// </summary>
-        Task JumpToEndAsync(ISessionContext current,string workflowId, string opinion, List<FileDto> files, DateTime? expiredTime,
-            EReviewResult reviewResult = EReviewResult.Unknown, CancellationToken cancellationToken = default);
-
         ////////
 
         /// <summary>

+ 0 - 78
src/Hotline.Application/FlowEngine/WorkflowApplication.cs

@@ -442,84 +442,6 @@ public class WorkflowApplication : IWorkflowApplication, IScopeDependency
         await NextAsync(dto, cancellationToken: cancellationToken);
     }
 
-    /// <summary>
-    /// 跳转至结束节点(无视流程模板配置以及当前办理对象,直接跳至结束节点)
-    /// </summary>
-    public async Task JumpToEndAsync(ISessionContext current, string workflowId, string opinion, List<FileDto> files, DateTime? expiredTime,
-        EReviewResult reviewResult = EReviewResult.Unknown, CancellationToken cancellationToken = default)
-    {
-        var workflow = await _workflowDomainService.GetWorkflowAsync(workflowId, withDefine: true, withSteps: true,
-            withTraces: true, cancellationToken: cancellationToken);
-        var endStepDefine = workflow.WorkflowDefinition.FindEndStepDefine();
-        if (endStepDefine is null)
-            throw new UserFriendlyException("未正确配置结束节点");
-
-        //var currentStep = workflow.GetActualStep();
-        //if (currentStep is null)
-        //    throw new UserFriendlyException("未找到实际办理节点");
-
-        var dto = new BasicWorkflowDto
-        {
-            NextStepCode = endStepDefine.Code,
-            NextStepName = endStepDefine.Name,
-            FlowDirection = EFlowDirection.OrgToFile,
-            BusinessType = endStepDefine.BusinessType,
-            ReviewResult = reviewResult,
-            Opinion = opinion,
-            Files = files
-        };
-
-        var unhandleSteps = workflow.Steps
-            .Where(d => d.Status != EWorkflowStepStatus.Handled).ToList();
-        var unhandleTraces = workflow.Traces
-            .Where(d => d.Status != EWorkflowStepStatus.Handled).ToList();
-
-        //get currentStep
-        var currentStep = unhandleSteps.MaxBy(d => d.CreationTime)
-                          ?? workflow.Steps.MaxBy(d => d.CreationTime);
-
-        foreach (var step in unhandleSteps)
-        {
-            await _workflowDomainService.HandleStepAsync(step, workflow, dto, null, null, cancellationToken);
-            if (step.IsStartCountersign)
-                step.CountersignEnd();
-
-            var trace = unhandleTraces.First(d => d.StepId == step.Id);
-            _mapper.Map(dto, trace);
-            _mapper.Map(step, trace);
-        }
-
-        await _workflowStepRepository.UpdateRangeAsync(unhandleSteps, cancellationToken);
-        await _workflowTraceRepository.UpdateRangeAsync(unhandleTraces, cancellationToken);
-
-        //结束会签
-        var counstersigns = await _workflowCountersignRepository.Queryable()
-            .Where(d => !d.EndTime.HasValue)
-            .ToListAsync(cancellationToken);
-        foreach (var counstersign in counstersigns)
-        {
-            //结束会签
-            counstersign.End(currentStep.Id, currentStep.Code, currentStep.BusinessType,
-                current.UserId, current.UserName,
-                current.OrgId, current.OrgName,
-                current.OrgAreaCode, current.OrgAreaName);
-        }
-
-        await _workflowCountersignRepository.UpdateRangeAsync(counstersigns, cancellationToken);
-
-
-        // //更新实际办理节点信息
-        // workflow.UpdateActualStepWhenHandle(currentStep, current.OrgAreaCode, current.OrgAreaName, current.OrgLevel);
-        //
-        // workflow.UpdateCurrentStepWhenHandle(currentStep, current.OrgAreaCode, current.OrgAreaName, current.OrgLevel);
-
-        if (workflow.Steps.All(d => d.StepType != EStepType.End))
-        {
-            await _workflowDomainService.EndAsync(current, workflow, dto,
-                endStepDefine, currentStep, expiredTime, cancellationToken);
-        }
-    }
-
     /// <summary>
     /// 查询开始流程的下一步待选节点
     /// </summary>

+ 18 - 0
src/Hotline.Share/Dtos/Order/Handle/OrderBatchFileDto.cs

@@ -0,0 +1,18 @@
+using Hotline.Share.Dtos.File;
+
+namespace Hotline.Share.Dtos.Order.Handle;
+
+public class OrderBatchFileDto
+{
+    public List<string> OrderIds { get; set; }
+
+    /// <summary>
+    /// 办理意见
+    /// </summary>
+    public string Opinion { get; set; } = string.Empty;
+
+    /// <summary>
+    /// 附件
+    /// </summary>
+    public List<FileDto> Files { get; set; } = new();
+}

+ 6 - 16
src/Hotline/FlowEngine/Workflows/IWorkflowDomainService.cs

@@ -151,22 +151,6 @@ namespace Hotline.FlowEngine.Workflows
         /// </summary>
         Task<(Kv, IReadOnlyList<Kv>)> GetHandleOrgsAsync(string workflowId, CancellationToken cancellationToken);
 
-        /// <summary>
-        /// 依据配置过滤下一节点
-        /// </summary>
-        List<StepDefine> NextStepDefineFilter(EPathPolicy pathPolicy, List<StepDefine> nextStepDefines);
-
-        // /// <summary>
-        // /// 撤销流程
-        // /// </summary>
-        // Task CancelAsync(CancelDto dto, DateTime? expiredTime, ISessionContext current, CancellationToken cancellationToken);
-
-        ///// <summary>
-        ///// 更新期满时间
-        ///// </summary>
-        //Task UpdateExpiredTimeAsync(Workflow workflow, DateTime expiredTime, string timelimit, int? timelimiteCount,
-        //    ETimeType? timelimitUnit, DateTime nearlyExpiredTime, CancellationToken cancellationToken);
-
         /// <summary>
         /// 新增流程流转记录
         /// </summary>
@@ -302,5 +286,11 @@ namespace Hotline.FlowEngine.Workflows
         /// 追加归档信息(接收ds推送12315归档信息)
         /// </summary>
         Task AppendFileOpinionAsync(string workflowId, string opinion, List<FileDto> files, CancellationToken cancellationToken);
+        
+        /// <summary>
+        /// 跳转至结束节点(无视流程模板配置以及当前办理对象,直接跳至结束节点)
+        /// </summary>
+        Task JumpToEndAsync(ISessionContext current,string workflowId, string opinion, List<FileDto> files, DateTime? expiredTime,
+            EReviewResult reviewResult = EReviewResult.Unknown, CancellationToken cancellationToken = default);
     }
 }

+ 73 - 55
src/Hotline/FlowEngine/Workflows/WorkflowDomainService.cs

@@ -1439,6 +1439,79 @@ namespace Hotline.FlowEngine.Workflows
             await _workflowStepRepository.UpdateAsync(prevStep, cancellationToken);
         }
 
+        /// <summary>
+        /// 跳转至结束节点(无视流程模板配置以及当前办理对象,直接跳至结束节点)
+        /// </summary>
+        public async Task JumpToEndAsync(ISessionContext current, string workflowId, string opinion, List<FileDto> files, DateTime? expiredTime,
+            EReviewResult reviewResult = EReviewResult.Unknown, CancellationToken cancellationToken = default)
+        {
+            var workflow = await GetWorkflowAsync(workflowId, withDefine: true, withSteps: true, withTraces: true,
+                withCountersigns: true, cancellationToken: cancellationToken);
+            var endStepDefine = workflow.WorkflowDefinition.FindEndStepDefine();
+            if (endStepDefine is null)
+                throw new UserFriendlyException("未正确配置结束节点");
+
+            var dto = new BasicWorkflowDto
+            {
+                NextStepCode = endStepDefine.Code,
+                NextStepName = endStepDefine.Name,
+                FlowDirection = EFlowDirection.OrgToFile,
+                BusinessType = endStepDefine.BusinessType,
+                ReviewResult = reviewResult,
+                Opinion = opinion,
+                Files = files
+            };
+
+            var unhandleSteps = workflow.Steps
+                .Where(d => d.Status != EWorkflowStepStatus.Handled).ToList();
+            var unhandleTraces = workflow.Traces
+                .Where(d => d.Status != EWorkflowStepStatus.Handled).ToList();
+
+            //get currentStep
+            var currentStep = unhandleSteps.MaxBy(d => d.CreationTime)
+                              ?? workflow.Steps.MaxBy(d => d.CreationTime);
+
+            foreach (var step in unhandleSteps)
+            {
+                await HandleStepAsync(step, workflow, dto, null, null, cancellationToken);
+                if (step.IsStartCountersign)
+                    step.CountersignEnd();
+
+                var trace = unhandleTraces.First(d => d.StepId == step.Id);
+                _mapper.Map(dto, trace);
+                _mapper.Map(step, trace);
+            }
+
+            await _workflowStepRepository.UpdateRangeAsync(unhandleSteps, cancellationToken);
+            await _workflowTraceRepository.UpdateRangeAsync(unhandleTraces, cancellationToken);
+
+            //结束会签
+            var counstersigns = workflow.Countersigns
+                .Where(d => !d.EndTime.HasValue)
+                .ToList();
+            foreach (var counstersign in counstersigns)
+            {
+                //结束会签
+                counstersign.End(currentStep.Id, currentStep.Code, currentStep.BusinessType,
+                    current.UserId, current.UserName,
+                    current.OrgId, current.OrgName,
+                    current.OrgAreaCode, current.OrgAreaName);
+            }
+
+            await _workflowCountersignRepository.UpdateRangeAsync(counstersigns, cancellationToken);
+
+
+            // //更新实际办理节点信息
+            // workflow.UpdateActualStepWhenHandle(currentStep, current.OrgAreaCode, current.OrgAreaName, current.OrgLevel);
+            //
+            // workflow.UpdateCurrentStepWhenHandle(currentStep, current.OrgAreaCode, current.OrgAreaName, current.OrgLevel);
+
+            if (workflow.Steps.All(d => d.StepType != EStepType.End))
+            {
+                await EndAsync(current, workflow, dto, endStepDefine, currentStep, expiredTime, cancellationToken);
+            }
+        }
+
         /// <summary>
         /// 查找当前会签内所有节点(含start,end)
         /// </summary>
@@ -1782,61 +1855,6 @@ namespace Hotline.FlowEngine.Workflows
             return (new Kv(workflow.ActualHandleOrgCode, workflow.ActualHandleOrgName), items);
         }
 
-        /// <summary>
-        /// 依据配置过滤下一节点
-        /// </summary>
-        public List<StepDefine> NextStepDefineFilter(EPathPolicy pathPolicy, List<StepDefine> nextStepDefines)
-        {
-            switch (pathPolicy)
-            {
-                case EPathPolicy.DirectUpper:
-                    break;
-                case EPathPolicy.DirectUpperCenterIsTop:
-                    var currentOrgLevel = _sessionContextProvider.SessionContext.RequiredOrgId.CalcOrgLevel();
-                    if (currentOrgLevel == 1)
-                    {
-                        nextStepDefines = nextStepDefines.Where(d => d.IsCenter()).ToList();
-                    }
-                    else
-                    {
-                        var upperLevel = (--currentOrgLevel).ToString();
-                        nextStepDefines = nextStepDefines
-                            .Where(d => d.HandlerType is EHandlerType.OrgLevel &&
-                                        d.HandlerTypeItems.Any(x => x.Key == upperLevel))
-                            .ToList();
-                    }
-
-                    break;
-                default:
-                    throw new ArgumentOutOfRangeException();
-            }
-
-            return nextStepDefines;
-        }
-
-        // /// <summary>
-        // /// 撤销流程
-        // /// </summary>
-        // public async Task CancelAsync(CancelDto dto, DateTime? expiredTime, ISessionContext current,
-        //     CancellationToken cancellationToken)
-        // {
-        //     var workflow = await GetWorkflowAsync(dto.WorkflowId, withDefine: true, withSteps: true,
-        //         cancellationToken: cancellationToken);
-        //
-        //     var currentStep = GetUnHandleStep(workflow.Steps, _sessionContextProvider.SessionContext.RequiredOrgId,
-        //         _sessionContextProvider.SessionContext.RequiredUserId, _sessionContextProvider.SessionContext.Roles);
-        //     //var (currentStepBox, currentStep) = GetUnCompleteStep(workflow.Steps, _sessionContextProvider.SessionContext.RequiredOrgId, _sessionContextProvider.SessionContext.RequiredUserId);
-        //
-        //     var endStepDefine = workflow.WorkflowDefinition.FindEndStepDefine();
-        //
-        //     var basicDto = _mapper.Map<BasicWorkflowDto>(dto);
-        //     var endTrace = await EndAsync(workflow, basicDto, endStepDefine, currentStep,
-        //         expiredTime, cancellationToken: cancellationToken);
-        //
-        //     await _publisher.PublishAsync(new CancelWorkflowNotify(workflow), PublishStrategy.ParallelWhenAll,
-        //         cancellationToken);
-        // }
-
         /// <summary>
         /// 新增流程流转记录
         /// </summary>