xf 1 year ago
parent
commit
96e7e9ff30

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

@@ -632,7 +632,7 @@ public class OrderController : BaseController
     public async Task<PagedDto<OrderCanVisitAgainDto>> OrderVisitAgainList([FromQuery] OrderVisitAgainListDto dto)
     {
         var (total, items) = await _orderVisitedDetailRepository.Queryable()
-            .Includes(x => x.OrderVisit,x=>x.Order)
+            .Includes(x => x.OrderVisit, x => x.Order)
             .WhereIF(!string.IsNullOrEmpty(dto.Keyword), x => x.OrderVisit.Order.No.Contains(dto.Keyword))
             .Where(x => x.OrderVisit.VisitState == EVisitState.Visited &&
                         (x.OrderVisit.VisitType == EVisitType.SmsVisit ||
@@ -782,8 +782,8 @@ public class OrderController : BaseController
     {
         var (total, items) = await _orderVisitApplyRepository.Queryable()
             .Includes(d => d.Order)
-            .Includes(d=>d.OrderVisit,d=>d.OrderVisitDetails.Where(x=>x.VisitTarget == EVisitTarget.Org).ToList())
-            .Includes(d=>d.OrderVisit,d=>d.Employee)
+            .Includes(d => d.OrderVisit, d => d.OrderVisitDetails.Where(x => x.VisitTarget == EVisitTarget.Org).ToList())
+            .Includes(d => d.OrderVisit, d => d.Employee)
             .Includes(d => d.Employee)
             .WhereIF(dto.VisitApplyState != null, x => x.VisitApplyState == dto.VisitApplyState)
             .WhereIF(!string.IsNullOrEmpty(dto.Keyword), x => x.OrderNo.Contains(dto.Keyword))
@@ -802,7 +802,7 @@ public class OrderController : BaseController
     [HttpGet("visitapply/{id}")]
     public async Task<VisitApplyDto> VisitApplyEntity(string id)
     {
-        var model = await _orderVisitApplyRepository.GetExtAsync(x => x.Id == id,x=>x.Includes(d=>d.Order)) ;
+        var model = await _orderVisitApplyRepository.GetExtAsync(x => x.Id == id, x => x.Includes(d => d.Order));
 
         return _mapper.Map<VisitApplyDto>(model);
     }
@@ -1388,7 +1388,7 @@ public class OrderController : BaseController
             .WhereIF(dto.SuperviseState > -1, x => x.State == dto.SuperviseState)
             .WhereIF(dto.CreationTimeStart.HasValue, d => d.CreationTime >= dto.CreationTimeStart)
             .WhereIF(dto.CreationTimeEnd.HasValue, d => d.CreationTime <= dto.CreationTimeEnd)
-            .Where(x=>x.OrgId  == _sessionContext.OrgId)
+            .Where(x => x.OrgId == _sessionContext.OrgId)
             .OrderByDescending(x => x.CreationTime)
             .ToPagedListAsync(dto.PageIndex, dto.PageSize, HttpContext.RequestAborted);
 
@@ -1575,7 +1575,7 @@ public class OrderController : BaseController
             .WhereIF(dto.CreationTimeStart.HasValue, d => d.CreationTime >= dto.CreationTimeStart)
             .WhereIF(dto.CreationTimeEnd.HasValue, d => d.CreationTime <= dto.CreationTimeEnd)
             .Where(x => x.OrgId == _sessionContext.OrgId)
-			.OrderByDescending(x => x.CreationTime)
+            .OrderByDescending(x => x.CreationTime)
             .ToPagedListAsync(dto.PageIndex, dto.PageSize, HttpContext.RequestAborted);
 
         return new PagedDto<UrgeOrderDto>(total, _mapper.Map<IReadOnlyList<UrgeOrderDto>>(items));
@@ -1846,7 +1846,7 @@ public class OrderController : BaseController
         var order = _mapper.Map<Order>(dto);
         order.SignerId = _sessionContext.UserId;
         order.SignerName = _sessionContext.UserName;
-		var orderId = await _orderDomainService.AddAsync(order, HttpContext.RequestAborted);
+        var orderId = await _orderDomainService.AddAsync(order, HttpContext.RequestAborted);
         //if (dto.Tags.Any()) await _repositoryts.AddVectorAsync(orderId, DateTime.Now, dto.Tags, HttpContext.RequestAborted);
         if (dto.Files.Any()) await _fileRepository.AddFileAsync(dto.Files, orderId, HttpContext.RequestAborted);
         if (dto.RepeatableEventDetails?.Any() ?? false)
@@ -1879,7 +1879,8 @@ public class OrderController : BaseController
 
             if (order.Source is ESource.ProvinceStraight)
             {
-                var orderExtension = await _orderDomainService.GetOrderExtensionsAsync(dto.ProvinceNo, HttpContext.RequestAborted);
+                var orderExtension =
+                    await _orderDomainService.GetOrderExtensionsAsync(dto.ProvinceNo, HttpContext.RequestAborted);
                 if (orderExtension is not null)
                 {
                     orderExtension.Id = orderId;
@@ -1962,7 +1963,7 @@ public class OrderController : BaseController
             .FirstAsync(d => d.Id == dto.Id);
         if (order == null)
             throw UserFriendlyException.SameMessage("无效工单编号");
-        if (order.Status != EOrderStatus.WaitForAccept || !string.IsNullOrEmpty(order.WorkflowId))
+        if (order.Status > EOrderStatus.BackToUnAccept)
             throw UserFriendlyException.SameMessage("工单已发起流程");
 
         if (order.Content != dto.Content)
@@ -2159,29 +2160,53 @@ public class OrderController : BaseController
                 ? new[] { EWorkflowStepStatus.Handled }
                 : new[] { EWorkflowStepStatus.WaitForAccept, EWorkflowStepStatus.WaitForHandle };
 
-        RefAsync<int> total = 0;
-        var dtos = await _workflowStepRepository.Queryable()
-            .InnerJoin<Workflow>((s, w) => s.WorkflowId == w.Id)
-            .LeftJoin<Order>((s, w, o) => w.ExternalId == o.Id)
-            .Where((s, w, o) => SqlFunc.JsonListObjectAny(s.Handlers, "Key", _sessionContext.RequiredUserId) ||
-                                SqlFunc.JsonListObjectAny(s.Handlers, "Key", _sessionContext.RequiredOrgId))
-            .WhereIF(dto.IsProvince.HasValue, (s, w, o) => o.IsProvince == dto.IsProvince)
-            .WhereIF(dto.IsHandled.HasValue, (s, w, o) => handleStatuses.Contains(s.Status))
-            .WhereIF(!string.IsNullOrEmpty(dto.Keyword),
-                (s, w, o) => o.No.Contains(dto.Keyword) || o.Title.Contains(dto.Keyword))
-            .OrderByDescending((s) => s.StepExpiredTime)
-            .Select((s, w, o) => new OrderDto
-            {
-                Id = o.Id,
-                ExpiredTime = o.ExpiredTime,
-                //StepExpiredTime = s.StepExpiredTime,
-                Status = o.Status
-            }, true)
-            .ToPageListAsync(dto.PageIndex, dto.PageSize, total, HttpContext.RequestAborted);
+        //RefAsync<int> total = 0;
+        //var dtos = await _workflowStepRepository.Queryable()
+        //    .InnerJoin<Workflow>((s, w) => s.WorkflowId == w.Id)
+        //    .LeftJoin<Order>((s, w, o) => w.ExternalId == o.Id)
+        //    .Where((s, w, o) => SqlFunc.JsonListObjectAny(s.Handlers, "Key", _sessionContext.RequiredUserId) ||
+        //                        SqlFunc.JsonListObjectAny(s.Handlers, "Key", _sessionContext.RequiredOrgId))
+        //    .WhereIF(dto.IsProvince.HasValue, (s, w, o) => o.IsProvince == dto.IsProvince)
+        //    .WhereIF(dto.IsHandled.HasValue, (s, w, o) => handleStatuses.Contains(s.Status))
+        //    .WhereIF(!string.IsNullOrEmpty(dto.Keyword),
+        //        (s, w, o) => o.No.Contains(dto.Keyword) || o.Title.Contains(dto.Keyword))
+        //    .OrderByDescending((s) => s.StepExpiredTime)
+        //    .Select((s, w, o) => new OrderDto
+        //    {
+        //        Id = o.Id,
+        //        ExpiredTime = o.ExpiredTime,
+        //        //StepExpiredTime = s.StepExpiredTime,
+        //        Status = o.Status
+        //    }, true)
+        //    .ToPageListAsync(dto.PageIndex, dto.PageSize, total, HttpContext.RequestAborted);
+
+        var (total, items) = await _orderRepository.Queryable(workflowFilter: false)
+            .Includes(d => d.Workflow, x => x.Steps)
+            .Where(d => SqlFunc.JsonListObjectAny(d.Workflow.HandlerUsers, "Key", _sessionContext.RequiredUserId) ||
+                        SqlFunc.JsonListObjectAny(d.Workflow.HandlerOrgs, "Key", _sessionContext.RequiredOrgId))
+            .WhereIF(dto.IsProvince.HasValue, d => d.IsProvince == dto.IsProvince)
+            .WhereIF(dto.IsHandled.HasValue, d => d.Workflow.Steps.Any(x => handleStatuses.Contains(x.Status)))
+            .WhereIF(!string.IsNullOrEmpty(dto.Keyword), d => d.No.Contains(dto.Keyword) || d.Title.Contains(dto.Keyword))
+            .OrderByDescending(d => d.ExpiredTime)
+            .ToPagedListAsync(dto, HttpContext.RequestAborted);
+
 
-        return new PagedDto<OrderDto>(total, dtos);
+        return new PagedDto<OrderDto>(total, _mapper.Map<IReadOnlyList<OrderDto>>(items));
     }
 
+    //public async Task<PagedDto<OrderDto>> QueryWaitedHandled([FromQuery] QueryOrderWaitedDto dto)
+    //{
+    //    var (total, items) = await _orderRepository.Queryable(workflowFilter: true)
+    //        .WhereIF(dto.IsProvince.HasValue, d => d.IsProvince == dto.IsProvince)
+    //        .WhereIF(!string.IsNullOrEmpty(dto.Keyword),
+    //            d => d.No.Contains(dto.Keyword) || d.Title.Contains(dto.Keyword))
+
+    //        .OrderByDescending(d => d.CreationTime)
+    //        .ToPagedListAsync(dto, HttpContext.RequestAborted);
+
+    //    return new PagedDto<OrderDto>(total, _mapper.Map<IReadOnlyList<OrderDto>>(items));
+    //}
+
     /// <summary>
     /// 查询坐席待办
     /// </summary>
@@ -2353,18 +2378,25 @@ public class OrderController : BaseController
         await _orderSpecialRepository.AddAsync(model, HttpContext.RequestAborted);
         if (model.State == 1)
         {
-            var recall = new RecallDto { WorkflowId = dto.WorkflowId!, NextStepCode = dto.NextStepCode, NextStepName = dto.NextStepName, NextHandlers = dto.NextHandlers, Opinion = dto.Cause };
+            var recall = new RecallDto
+            {
+                WorkflowId = dto.WorkflowId!,
+                NextStepCode = dto.NextStepCode,
+                NextStepName = dto.NextStepName,
+                NextHandlers = dto.NextHandlers,
+                Opinion = dto.Cause
+            };
             if (dto.AlterTime) recall.External = new External { TimeLimit = dto.TimeLimit, TimeLimitUnit = dto.TimeLimitUnit };
-			if (dto.Files.Any()) recall.Additions = dto.Files;
-			await _workflowApplication.RecallAsync(recall, HttpContext.RequestAborted);
+            if (dto.Files.Any()) recall.Additions = dto.Files;
+            await _workflowApplication.RecallAsync(recall, HttpContext.RequestAborted);
             // 如果是话务部 修改签收状态
-            if ("start".Equals(dto.NextStepCode)) 
+            if ("start".Equals(dto.NextStepCode))
             {
                 var order = await _orderRepository.GetAsync(dto.OrderId);
                 order.BackToUnsign();
                 await _orderRepository.UpdateAsync(order, HttpContext.RequestAborted);
-			}
-		}
+            }
+        }
     }
 
     /// <summary>
@@ -2383,11 +2415,18 @@ public class OrderController : BaseController
         await _orderSpecialRepository.UpdateAsync(special, HttpContext.RequestAborted);
         if (special.State == 1)
         {
-			var recall = new RecallDto{ WorkflowId = dto.WorkflowId!, NextStepCode = dto.NextStepCode, NextStepName = dto.NextStepName, NextHandlers = dto.NextHandlers, Opinion = dto.Opinion };
-			if (dto.AlterTime) recall.External = new External { TimeLimit = dto.TimeLimit, TimeLimitUnit = dto.TimeLimitUnit };
+            var recall = new RecallDto
+            {
+                WorkflowId = dto.WorkflowId!,
+                NextStepCode = dto.NextStepCode,
+                NextStepName = dto.NextStepName,
+                NextHandlers = dto.NextHandlers,
+                Opinion = dto.Opinion
+            };
+            if (dto.AlterTime) recall.External = new External { TimeLimit = dto.TimeLimit, TimeLimitUnit = dto.TimeLimitUnit };
             if (dto.Files.Any()) recall.Additions = dto.Files;
-			await _workflowApplication.RecallAsync(recall, HttpContext.RequestAborted);
-		}
+            await _workflowApplication.RecallAsync(recall, HttpContext.RequestAborted);
+        }
     }
 
     /// <summary>
@@ -2409,13 +2448,13 @@ public class OrderController : BaseController
         return new PagedDto<OrderSpecialDto>(total, _mapper.Map<IReadOnlyList<OrderSpecialDto>>(items));
     }
 
-	/// <summary>
-	/// 工单列表
-	/// </summary>
-	/// <param name="dto"></param>
-	/// <returns></returns>
-	[Permission(EPermission.ApplySpecialOrderList)]
-	[HttpGet("special/apply_list")]
+    /// <summary>
+    /// 工单列表
+    /// </summary>
+    /// <param name="dto"></param>
+    /// <returns></returns>
+    [Permission(EPermission.ApplySpecialOrderList)]
+    [HttpGet("special/apply_list")]
     public async Task<PagedDto<OrderDto>> SpecialList([FromQuery] QueryOrderDto dto)
     {
         var query = _orderRepository.Queryable()
@@ -2480,7 +2519,7 @@ public class OrderController : BaseController
             SpecialTimeType = EnumExts.GetDescriptions<ETimeType>(),
             SpecialReason = _sysDicDataCacheManager.GetSysDicDataCache(SysDicTypeConsts.SpecialReason),
             Step = await _workflowApplication.GetRecallStepsAsync(id, HttpContext.RequestAborted)
-		};
+        };
         return rsp;
     }
 
@@ -2493,7 +2532,8 @@ public class OrderController : BaseController
     public async Task<int> SpecialHandleTime([FromQuery] OrderSpecialHandleTime dto)
     {
         var order = await _orderRepository.GetAsync(dto.OrderId);
-        if (dto.FlowDirection != null &&  dto.FlowDirection == EFlowDirection.OrgToCenter) return _timeLimitDomainService.GetOrderTimeLimitConfig(string.Empty);
+        if (dto.FlowDirection != null && dto.FlowDirection == EFlowDirection.OrgToCenter)
+            return _timeLimitDomainService.GetOrderTimeLimitConfig(string.Empty);
         return _timeLimitDomainService.GetOrderTimeLimitConfig(order.AcceptTypeCode);
     }
 

+ 3 - 3
src/Hotline.Api/StartupExtensions.cs

@@ -85,8 +85,8 @@ internal static class StartupExtensions
         //迅时IPPBX
         services.AddNewRock(callCenterConfiguration.DeviceConfigs.Address);
 
-        //wex
-        services.AddWex(callCenterConfiguration.Wex.Address);
+        ////wex
+        //services.AddWex(callCenterConfiguration.Wex.Address);
 
         //tr
         var trConfig = configuration.GetRequiredSection("Tr").Get<TrConfiguration>();
@@ -94,7 +94,7 @@ internal static class StartupExtensions
 
         //sqlsugar
         services.AddSqlSugar(configuration);
-        services.AddWexDb(configuration);
+        //services.AddWexDb(configuration);
 
         //cache
         services.AddCache(d =>

+ 30 - 17
src/Hotline.Application/FlowEngine/WorkflowApplication.cs

@@ -225,7 +225,8 @@ public class WorkflowApplication : IWorkflowApplication, IScopeDependency
         }
 
         var flowAssignInfo =
-            await GetNextStepFlowAssignInfoAsync(workflow, currentStepDefine, currentStep, nextStepDefine, dto, cancellationToken);
+            await GetNextStepFlowAssignInfoAsync(workflow, currentStepDefine, currentStep, nextStepDefine, dto,
+                cancellationToken);
 
         await _workflowDomainService.NextAsync(workflow, currentStep, dto, nextStepDefine, flowAssignInfo,
             cancellationToken);
@@ -236,7 +237,8 @@ public class WorkflowApplication : IWorkflowApplication, IScopeDependency
     /// </summary>
     public async Task RecallAsync(RecallDto dto, CancellationToken cancellationToken)
     {
-        var workflow = await _workflowDomainService.GetWorkflowAsync(dto.WorkflowId, true, true, cancellationToken: cancellationToken);
+        var workflow =
+            await _workflowDomainService.GetWorkflowAsync(dto.WorkflowId, true, true, cancellationToken: cancellationToken);
 
         //await _orderDomainService.ReadyToRecallAsync(workflow.ExternalId, cancellationToken);
 
@@ -245,7 +247,8 @@ public class WorkflowApplication : IWorkflowApplication, IScopeDependency
             throw UserFriendlyException.SameMessage("结束节点不支持撤回");
         //var isStartCountersign = targetStepDefine.CouldPrevStartCountersign(dto.NextHandlers.Count);
         var flowAssignInfo =
-            await GetNextStepFlowAssignInfoByDefineAsync(targetStepDefine, dto.IsStartCountersign, dto.NextHandlers, cancellationToken);
+            await GetNextStepFlowAssignInfoByDefineAsync(targetStepDefine, dto.IsStartCountersign, dto.NextHandlers,
+                cancellationToken);
         await _workflowDomainService.RecallAsync(workflow, dto, targetStepDefine, flowAssignInfo, cancellationToken);
     }
 
@@ -254,7 +257,8 @@ public class WorkflowApplication : IWorkflowApplication, IScopeDependency
     /// </summary>
     public async Task RecallToStartAsync(string workflowId, string opinion, CancellationToken cancellationToken)
     {
-        var workflow = await _workflowDomainService.GetWorkflowAsync(workflowId, true, true, cancellationToken: cancellationToken);
+        var workflow =
+            await _workflowDomainService.GetWorkflowAsync(workflowId, true, true, cancellationToken: cancellationToken);
 
         var targetStepDefine = workflow.WorkflowDefinition.FindSendStepDefine();
 
@@ -433,7 +437,8 @@ public class WorkflowApplication : IWorkflowApplication, IScopeDependency
         //    DynamicPolicy = startStep.InstancePolicy
         //};
 
-        if (startStepDefine.InstanceMode is EInstanceMode.Dynamic && !DynamicShouldTerminal(startStepDefine, _sessionContext.OrgLevel))
+        if (startStepDefine.InstanceMode is EInstanceMode.Dynamic &&
+            !DynamicShouldTerminal(startStepDefine, _sessionContext.OrgLevel))
         {
             //var nextStepOption = CreateDynamicStep(startStep.InstancePolicy);
             //dto.Steps = new List<NextStepOption> { nextStepOption };
@@ -455,7 +460,8 @@ public class WorkflowApplication : IWorkflowApplication, IScopeDependency
         //        .ToList();
         return new NextStepsDto
         {
-            Steps = await GetConfigStepsAsync(definition.FlowType, startStepDefine.StepType, startStepDefine.BusinessType, firstStepDefines,
+            Steps = await GetConfigStepsAsync(definition.FlowType, startStepDefine.StepType, startStepDefine.BusinessType,
+                firstStepDefines,
                 cancellationToken)
         };
         //dto.Steps = steps;
@@ -485,7 +491,8 @@ public class WorkflowApplication : IWorkflowApplication, IScopeDependency
         if (currentStep.InstanceMode is EInstanceMode.Dynamic && !DynamicShouldTerminal(currentStep))
         {
             //动态生成下一步
-            var nextStepOption = await GetDynamicStepAsync(currentStep.InstancePolicy.Value, currentStep.StepType, currentStep.BusinessType,
+            var nextStepOption = await GetDynamicStepAsync(currentStep.InstancePolicy.Value, currentStep.StepType,
+                currentStep.BusinessType,
                 cancellationToken);
             dto.Steps = new List<NextStepOption> { nextStepOption };
             return dto;
@@ -517,7 +524,8 @@ public class WorkflowApplication : IWorkflowApplication, IScopeDependency
                 var countersignEndOption = GetCsEndStepByPrev(workflow.Steps, currentStep);
                 //按会签策略
                 var nextStepOption =
-                    await GetDynamicStepAsync(currentStep.CountersignPolicy.Value, currentStep.StepType, currentStep.BusinessType, cancellationToken);
+                    await GetDynamicStepAsync(currentStep.CountersignPolicy.Value, currentStep.StepType, currentStep.BusinessType,
+                        cancellationToken);
                 dto.Steps = new List<NextStepOption> { nextStepOption, countersignEndOption };
                 return dto;
             }
@@ -527,7 +535,8 @@ public class WorkflowApplication : IWorkflowApplication, IScopeDependency
         if (!nextDefines.Any())
             throw new UserFriendlyException("未正确配置下一节点");
 
-        dto.Steps = await GetConfigStepsAsync(workflow.FlowType, currentStep.StepType, currentStep.BusinessType, nextDefines, cancellationToken);
+        dto.Steps = await GetConfigStepsAsync(workflow.FlowType, currentStep.StepType, currentStep.BusinessType, nextDefines,
+            cancellationToken);
 
         if (currentStep.IsInCountersign() && currentStep.IsTopCountersignEndStep(workflow.TopCountersignStepId))
         {
@@ -538,7 +547,6 @@ public class WorkflowApplication : IWorkflowApplication, IScopeDependency
         }
 
         return dto;
-
     }
 
     /// <summary>
@@ -546,8 +554,9 @@ public class WorkflowApplication : IWorkflowApplication, IScopeDependency
     /// </summary>
     public async Task<RecallStepsDto> GetRecallStepsAsync(string workflowId, CancellationToken cancellationToken)
     {
-        var workflow = await _workflowDomainService.GetWorkflowAsync(workflowId, true, true, cancellationToken: cancellationToken);
-        var originSteps = workflow.Steps.Where(d => d.StepType != EStepType.End && d.IsOrigin).ToList();//todo 恢复到可撤回至发起人节点
+        var workflow =
+            await _workflowDomainService.GetWorkflowAsync(workflowId, true, true, cancellationToken: cancellationToken);
+        var originSteps = workflow.Steps.Where(d => d.StepType != EStepType.End && d.IsOrigin).ToList(); //todo 恢复到可撤回至发起人节点
         var stepCodes = originSteps.Select(d => d.Code).ToList();
         var stepDefines = workflow.WorkflowDefinition.FindStepDefines(stepCodes);
         var currentStep = workflow.Steps.FirstOrDefault(d => d.Id == workflow.CurrentStepId);
@@ -595,8 +604,9 @@ public class WorkflowApplication : IWorkflowApplication, IScopeDependency
                         : null
                 : CheckFlowDirection(currentStep.BusinessType, stepDefine.BusinessType);
 
-            if (originStep.Handlers.Any()) 
-                stepOption.Handler = originStep.Handlers.FirstOrDefault(d => d.Key == originStep.HandlerId || d.Key == originStep.HandlerOrgId);
+            if (originStep.Handlers.Any())
+                stepOption.Handler =
+                    originStep.Handlers.FirstOrDefault(d => d.Key == originStep.HandlerId || d.Key == originStep.HandlerOrgId);
 
             steps.Add(stepOption);
         }
@@ -670,7 +680,8 @@ public class WorkflowApplication : IWorkflowApplication, IScopeDependency
         return stepOptions;
     }
 
-    public async Task<NextStepOption> GetConfigStepAsync(EFlowType flowType, StepDefine stepDefine, CancellationToken cancellationToken)
+    public async Task<NextStepOption> GetConfigStepAsync(EFlowType flowType, StepDefine stepDefine,
+        CancellationToken cancellationToken)
     {
         var handlers = new List<Kv>();
         if (stepDefine.StepType is EStepType.Start or EStepType.End)
@@ -1157,7 +1168,8 @@ public class WorkflowApplication : IWorkflowApplication, IScopeDependency
     /// <summary>
     /// 查询下一节点办理对象类型(user or org)及实际办理对象
     /// </summary>
-    public async Task<FlowAssignInfo> GetNextStepFlowAssignInfoAsync(Workflow workflow, StepDefine currentStepDefine, WorkflowStep currentStep,
+    public async Task<FlowAssignInfo> GetNextStepFlowAssignInfoAsync(Workflow workflow, StepDefine currentStepDefine,
+        WorkflowStep currentStep,
         StepDefine nextStepDefine, BasicWorkflowDto dto, CancellationToken cancellationToken)
     {
         if (nextStepDefine.StepType is EStepType.End) return new();
@@ -1204,7 +1216,8 @@ public class WorkflowApplication : IWorkflowApplication, IScopeDependency
             }
         }
 
-        if (currentStep.InstanceMode is EInstanceMode.Dynamic && !DynamicShouldTerminal(currentStepDefine, _sessionContext.OrgLevel))
+        if (currentStep.InstanceMode is EInstanceMode.Dynamic &&
+            !DynamicShouldTerminal(currentStepDefine, _sessionContext.OrgLevel))
             return FlowAssignInfo.Create(EFlowAssignType.Org, handlers, isStartCountersign);
 
         return await GetNextStepFlowAssignInfoByDefineAsync(nextStepDefine, isStartCountersign, handlers,

+ 0 - 96
src/Hotline.Application/Handlers/FlowEngine/RejectHandler.cs

@@ -1,96 +0,0 @@
-//using DotNetCore.CAP;
-//using Hotline.Article;
-//using Hotline.FlowEngine.Notifications;
-//using Hotline.FlowEngine.WorkflowModules;
-//using Hotline.Orders;
-//using Hotline.Share.Dtos.Order;
-//using Hotline.Share.Enums.Order;
-//using Hotline.Share.Mq;
-//using MapsterMapper;
-//using MediatR;
-//using Microsoft.Extensions.Logging;
-//using OracleInternal.SqlAndPlsqlParser.LocalParsing;
-//using XF.Domain.Repository;
-
-//namespace Hotline.Application.Handlers.FlowEngine;
-
-//public class RejectHandler : INotificationHandler<RejectNotify>
-//{
-//    private readonly IOrderDomainService _orderDomainService;
-//    private readonly IOrderRepository _orderRepository;
-//    private readonly ICapPublisher _capPublisher;
-//    private readonly IMapper _mapper;
-//    private readonly ILogger<RejectHandler> _logger;
-//    private readonly IRepository<OrderScreen> _orderScreenRepository;
-//    private readonly IRepository<Bulletin> _bulletinRepository;
-//    private readonly IRepository<Circular> _circularRepository;
-//    private readonly IRepository<OrderDelay> _orderDelayRepository;
-
-//    public RejectHandler(
-//        IOrderDomainService orderDomainService,
-//        IOrderRepository orderRepository,
-//        ICapPublisher capPublisher,
-//        IMapper mapper,
-//        ILogger<RejectHandler> logger,
-//        IRepository<OrderScreen> orderScreenRepository,
-//        IRepository<Bulletin> bulletinRepository,
-//        IRepository<Circular> circularRepository,
-//        IRepository<OrderDelay> orderDelayRepository)
-//    {
-//        _orderDomainService = orderDomainService;
-//        _orderRepository = orderRepository;
-//        _capPublisher = capPublisher;
-//        _mapper = mapper;
-//        _logger = logger;
-//        _orderScreenRepository = orderScreenRepository;
-//        _bulletinRepository = bulletinRepository;
-//        _circularRepository = circularRepository;
-//        _orderDelayRepository = orderDelayRepository;
-//    }
-
-//    /// <summary>Handles a notification</summary>
-//    /// <param name="notification">The notification</param>
-//    /// <param name="cancellationToken">Cancellation token</param>
-//    public async Task Handle(RejectNotify notification, CancellationToken cancellationToken)
-//    {
-//        var workflow = notification.Workflow;
-//        var data = notification.Dto;
-
-//        switch (workflow.ModuleCode)
-//        {
-//            case WorkflowModuleConsts.OrderDelay:
-//                var delay = await _orderDelayRepository.GetAsync(workflow.ExternalId, cancellationToken);
-//                if (delay != null)
-//                {
-//                    delay.DelayState = EDelayState.NoPass;
-//                    await _orderDelayRepository.UpdateAsync(delay, cancellationToken);
-//                }
-//                break;
-//            case WorkflowModuleConsts.OrderScreen:
-//                var screen = await _orderScreenRepository.GetAsync(workflow.ExternalId, cancellationToken);
-//                if (screen != null)
-//                {
-//                    screen.Status = EScreenStatus.Refuse;
-//                    screen.ReplyContent = workflow.ActualOpinion;
-//                    await _orderScreenRepository.UpdateAsync(screen, cancellationToken);
-//                }
-//                break;
-//            case WorkflowModuleConsts.BulletinApply:
-//                var bulletin = await _bulletinRepository.GetAsync(workflow.ExternalId, cancellationToken);
-//                if (bulletin != null)
-//                {
-//                    bulletin.BulletinState = Share.Enums.Article.EBulletinState.ReviewNoPass;
-//                    await _bulletinRepository.UpdateAsync(bulletin, cancellationToken);
-//                }
-//                break;
-//            case WorkflowModuleConsts.CircularApply:
-//                var circular = await _circularRepository.GetAsync(workflow.ExternalId, cancellationToken);
-//                if (circular != null)
-//                {
-//                    circular.CircularState = Share.Enums.Article.ECircularState.ReviewNoPass;
-//                    await _circularRepository.UpdateAsync(circular, cancellationToken);
-//                }
-//                break;
-//        }
-//    }
-//}

+ 2 - 2
src/Hotline.Application/Handlers/FlowEngine/EndWorkflowHandler.cs → src/Hotline.Application/Handlers/FlowEngine/WorkflowEndHandler.cs

@@ -23,7 +23,7 @@ using XF.Domain.Repository;
 
 namespace Hotline.Application.Handlers.FlowEngine;
 
-public class EndWorkflowHandler : INotificationHandler<EndWorkflowNotify>
+public class WorkflowEndHandler : INotificationHandler<EndWorkflowNotify>
 {
 
     private readonly IKnowledgeDomainService _knowledgeDomainService;
@@ -44,7 +44,7 @@ public class EndWorkflowHandler : INotificationHandler<EndWorkflowNotify>
     private readonly IRepository<OrderVisitApply> _orderVisitApplyRepository;
     private readonly IMediator _mediator;
 
-    public EndWorkflowHandler(
+    public WorkflowEndHandler(
         IKnowledgeDomainService knowledgeDomainService,
         IOrderDomainService orderDomainService,
         ITelDomainService telDomainService,

+ 4 - 4
src/Hotline.Application/Handlers/FlowEngine/NextStepHandler.cs → src/Hotline.Application/Handlers/FlowEngine/WorkflowNextHandler.cs

@@ -30,7 +30,7 @@ using XF.Domain.Repository;
 
 namespace Hotline.Application.Handlers.FlowEngine;
 
-public class NextStepHandler : INotificationHandler<NextStepNotify>
+public class WorkflowNextHandler : INotificationHandler<NextStepNotify>
 {
     private readonly IOrderDomainService _orderDomainService;
     private readonly IKnowledgeDomainService _knowledgeDomainService;
@@ -39,11 +39,11 @@ public class NextStepHandler : INotificationHandler<NextStepNotify>
     private readonly IWorkflowDomainService _workflowDomainService;
     private readonly ICapPublisher _capPublisher;
     private readonly IMapper _mapper;
-    private readonly ILogger<NextStepHandler> _logger;
+    private readonly ILogger<WorkflowNextHandler> _logger;
     private readonly IRepository<OrderScreen> _orderScreenRepository;
     private readonly IQualityRepository _qualityRepository;
 
-	public NextStepHandler(
+	public WorkflowNextHandler(
         IOrderDomainService orderDomainService,
         IKnowledgeDomainService knowledgeDomainService,
         IOrderRepository orderRepository,
@@ -51,7 +51,7 @@ public class NextStepHandler : INotificationHandler<NextStepNotify>
         IWorkflowDomainService workflowDomainService,
         ICapPublisher capPublisher,
         IMapper mapper,
-        ILogger<NextStepHandler> logger,
+        ILogger<WorkflowNextHandler> logger,
         IRepository<OrderScreen> orderScreenRepository,
         IQualityRepository qualityRepository)
     {

+ 5 - 2
src/Hotline.Application/Handlers/FlowEngine/PreviousStepHandler.cs → src/Hotline.Application/Handlers/FlowEngine/WorkflowPreviousHandler.cs

@@ -21,7 +21,7 @@ using Microsoft.Extensions.Logging;
 
 namespace Hotline.Application.Handlers.FlowEngine
 {
-    public class PreviousStepHandler : INotificationHandler<PreviousNotify>
+    public class WorkflowPreviousHandler : INotificationHandler<PreviousNotify>
     {
         private readonly IOrderDomainService _orderDomainService;
         private readonly IOrderRepository _orderRepository;
@@ -30,7 +30,7 @@ namespace Hotline.Application.Handlers.FlowEngine
         private readonly ICapPublisher _capPublisher;
         private readonly IMapper _mapper;
 
-        public PreviousStepHandler(
+        public WorkflowPreviousHandler(
             IOrderDomainService orderDomainService,
             IOrderRepository orderRepository,
             IWorkflowDomainService workflowDomainService,
@@ -61,7 +61,10 @@ namespace Hotline.Application.Handlers.FlowEngine
                     order.CheckIfFiled();
                     _mapper.Map(workflow, order);
                     if (notification.TargetStep.StepType is EStepType.Start)
+                    {
                         order.Status = EOrderStatus.BackToUnAccept;
+                        order.BackToUnsign();
+                    }
                     await _orderRepository.UpdateAsync(order, cancellationToken);
                     if (notification.IsOrgToCenter)
                     {

+ 5 - 2
src/Hotline.Application/Handlers/FlowEngine/RecallStepHandler.cs → src/Hotline.Application/Handlers/FlowEngine/WorkflowRecallHandler.cs

@@ -14,7 +14,7 @@ using MediatR;
 
 namespace Hotline.Application.Handlers.FlowEngine;
 
-public class RecallStepHandler : INotificationHandler<RecallNotify>
+public class WorkflowRecallHandler : INotificationHandler<RecallNotify>
 {
     private readonly IOrderDomainService _orderDomainService;
     private readonly IOrderRepository _orderRepository;
@@ -23,7 +23,7 @@ public class RecallStepHandler : INotificationHandler<RecallNotify>
     private readonly ICapPublisher _capPublisher;
     private readonly IMapper _mapper;
 
-    public RecallStepHandler(
+    public WorkflowRecallHandler(
         IOrderDomainService orderDomainService,
         IOrderRepository orderRepository,
         IWorkflowDomainService workflowDomainService,
@@ -53,7 +53,10 @@ public class RecallStepHandler : INotificationHandler<RecallNotify>
                 var order = await _orderDomainService.GetOrderAsync(workflow.ExternalId, cancellationToken);
                 _mapper.Map(workflow, order);
                 if (notification.TargetStep.StepType is EStepType.Start)
+                {
                     order.Status = EOrderStatus.BackToUnAccept;
+                    order.BackToUnsign();
+                }
                 await _orderRepository.UpdateAsync(order, cancellationToken);
 
                 if (data.FlowDirection.HasValue && data.External.TimeLimit.HasValue && data.External.TimeLimitUnit.HasValue)

+ 4 - 4
src/Hotline.Application/Handlers/FlowEngine/StartWorkflowHandler.cs → src/Hotline.Application/Handlers/FlowEngine/WorkflowStartHandler.cs

@@ -18,7 +18,7 @@ using Microsoft.Extensions.Logging;
 
 namespace Hotline.Application.Handlers.FlowEngine
 {
-    public class StartWorkflowHandler : INotificationHandler<StartWorkflowNotify>
+    public class WorkflowStartHandler : INotificationHandler<StartWorkflowNotify>
     {
         private readonly IOrderDomainService _orderDomainService;
         private readonly IKnowledgeDomainService _knowledgeDomainService;
@@ -26,17 +26,17 @@ namespace Hotline.Application.Handlers.FlowEngine
         private readonly IOrderRepository _orderRepository;
         private readonly ICapPublisher _capPublisher;
         private readonly IMapper _mapper;
-        private readonly ILogger<StartWorkflowHandler> _logger;
+        private readonly ILogger<WorkflowStartHandler> _logger;
         private readonly IQualityRepository _qualityRepository;
 
-		public StartWorkflowHandler(
+		public WorkflowStartHandler(
             IOrderDomainService orderDomainService,
             IKnowledgeDomainService knowledgeDomainService,
             ITelDomainService telDomainService,
             IOrderRepository orderRepository,
             ICapPublisher capPublisher,
             IMapper mapper,
-            ILogger<StartWorkflowHandler> logger,
+            ILogger<WorkflowStartHandler> logger,
             IQualityRepository qualityRepository)
         {
             _orderDomainService = orderDomainService;

+ 2 - 1
src/Hotline.Share/Enums/Order/EOrderStatus.cs

@@ -7,13 +7,14 @@ public enum EOrderStatus
     /// <summary>
     /// 待受理
     /// </summary>
+    [Description("待受理")]
     WaitForAccept = 0,
 
     /// <summary>
     /// 已开启流程,退回/撤回/跳转到开始节点
     /// 待受理,可编辑
     /// </summary>
-    [Description("待受理")]
+    [Description("退回待受理")]
     BackToUnAccept = 1,
 
     /// <summary>

+ 8 - 1
src/Hotline/FlowEngine/Workflows/Workflow.cs

@@ -299,7 +299,7 @@ public partial class Workflow : CreationEntity
     public List<HandlerGroupItem> HandlerUsers { get; set; } = new();
 
     /// <summary>
-    /// 办理部门code
+    /// 办理部门id
     /// </summary>
     [SugarColumn(ColumnDataType = "json", IsJson = true)]
     public List<HandlerGroupItem> HandlerOrgs { get; set; } = new();
@@ -596,6 +596,11 @@ public partial class Workflow
     /// </summary>
     public void ResetOption() => ActualOpinion = "办理中...";
 
+    /// <summary>
+    /// 状态设置为可流转
+    /// </summary>
+    public void SetStatusRunnable() => Status = EWorkflowStatus.Runnable;
+
     /// <summary>
     /// 重新设置办理人(删除当前待办人/部门),撤回/跳转场景,因当前办理人不是流程指定办理人
     /// </summary>
@@ -809,4 +814,6 @@ public class HandlerGroupItem
     public string Key { get; set; }
 
     public string Value { get; set; }
+
+
 }

+ 5 - 0
src/Hotline/FlowEngine/Workflows/WorkflowDomainService.cs

@@ -445,6 +445,9 @@ namespace Hotline.FlowEngine.Workflows
             //remove workflow.steps
             await _workflowStepRepository.RemoveRangeAsync(new List<WorkflowStep> { currentStep, prevStep }, cancellationToken);
 
+            if (workflow.Status is EWorkflowStatus.Completed)
+                workflow.SetStatusRunnable();
+
             //更新当前办理节点信息
             workflow.UpdateWorkflowCurrentStepInfo(false,
                 _sessionContext.RequiredUserId, _sessionContext.UserName,
@@ -1232,6 +1235,8 @@ namespace Hotline.FlowEngine.Workflows
 
             workflow.EndCountersign();
             workflow.ResetOption();
+            if (workflow.Status is EWorkflowStatus.Completed)
+                workflow.SetStatusRunnable();
 
             //recreate targetStep
             //var targetStepBoxNew = await CreateStepAsync(workflow, targetStepDefine, dto, EWorkflowStepStatus.WaitForAccept,