xf 1 rok temu
rodzic
commit
827a517d6d

+ 14 - 26
src/Hotline.Application/FlowEngine/WorkflowApplication.cs

@@ -495,7 +495,7 @@ public class WorkflowApplication : IWorkflowApplication, IScopeDependency
                 var countersignEndOption = GetCsEndStepByPrev(workflow.Steps, currentStep);
                 //按会签策略
                 var nextStepOption =
-                    await GetDynamicStepAsync(currentStep.CountersignPolicy.Value, currentStep.IsOrigin, currentStep.BusinessType, cancellationToken);
+                    await GetDynamicStepAsync(currentStep.CountersignPolicy.Value, cancellationToken);
                 dto.Steps = new List<NextStepOption> { nextStepOption, countersignEndOption };
                 return dto;
             }
@@ -534,13 +534,16 @@ public class WorkflowApplication : IWorkflowApplication, IScopeDependency
         var stepCodes = workflow.Steps.Where(d => d.StepType != EStepType.End && d.IsOrigin)
             .Select(d => d.Code).ToList();
         var stepDefines = workflow.WorkflowDefinition.FindStepDefines(stepCodes);
+        var currentStep = workflow.Steps.FirstOrDefault(d => d.Id == workflow.CurrentStepId);
+        if (currentStep is null)
+            throw new UserFriendlyException("无效当前节点编号");
         return new NextStepsDto
         {
-            Steps = await GetRecallConfigStepsAsync(stepDefines, cancellationToken)
+            Steps = await GetRecallConfigStepsAsync(workflow.Status is EWorkflowStatus.Completed, currentStep.BusinessType, stepDefines, cancellationToken)
         };
     }
 
-    private async Task<IReadOnlyList<NextStepOption>> GetRecallConfigStepsAsync(List<StepDefine> stepDefines, CancellationToken cancellationToken)
+    private async Task<IReadOnlyList<NextStepOption>> GetRecallConfigStepsAsync(bool isWorkflowFiled, EBusinessType currentBusinessType, List<StepDefine> stepDefines, CancellationToken cancellationToken)
     {
         var stepOptions = new List<NextStepOption>();
         foreach (var stepDefine in stepDefines)
@@ -553,13 +556,14 @@ public class WorkflowApplication : IWorkflowApplication, IScopeDependency
             }
 
             nextStepOption.InputRealHandler = false;
-            //todo thk 派单->坐席, 会签中怎么界定当前节点?
-            nextStepOption.FlowDirection =
-                stepDefine.BusinessType is EBusinessType.Center or EBusinessType.Send
+            //已归档工单,撤回至中心看作otc,撤回至部门看作cto
+            nextStepOption.FlowDirection = isWorkflowFiled
+                ? stepDefine.BusinessType is EBusinessType.Center or EBusinessType.Send
                     ? EFlowDirection.OrgToCenter
                     : stepDefine.BusinessType is EBusinessType.Department
                         ? EFlowDirection.CenterToOrg
-                        : null;
+                        : null
+                : CheckFlowDirection(currentBusinessType, stepDefine.BusinessType);
             stepOptions.Add(nextStepOption);
         }
 
@@ -708,14 +712,10 @@ public class WorkflowApplication : IWorkflowApplication, IScopeDependency
             case EBusinessType.Send:
                 return directionStepBusinessType is EBusinessType.Department
                     ? EFlowDirection.CenterToOrg
-                    : directionStepBusinessType is EBusinessType.File
-                        ? EFlowDirection.CenterToFile
-                        : EFlowDirection.CenterToCenter;
+                    : null;
             case EBusinessType.Department:
                 return directionStepBusinessType is EBusinessType.Center or EBusinessType.Send
                     ? EFlowDirection.OrgToCenter
-                    : directionStepBusinessType is EBusinessType.Department
-                    ? EFlowDirection.OrgToOrg
                     : null;
             case EBusinessType.File:
                 return null;
@@ -908,7 +908,6 @@ public class WorkflowApplication : IWorkflowApplication, IScopeDependency
             Key = prevStep.Code,
             Value = text, //parentStep.Name,//todo name不对,目前为definition.name,需改为x级部门办理
             BackToCountersignEnd = true,
-            BusinessType = prevStep.BusinessType,
             Items = handlers //new List<Kv> { new(prevStep.HandlerId, prevStep.HandlerName) },
         };
     }
@@ -948,12 +947,10 @@ public class WorkflowApplication : IWorkflowApplication, IScopeDependency
         };
     }
 
-    private async Task<NextStepOption> GetDynamicStepAsync(EDynamicPolicy policy, bool isOrigin,
-        EBusinessType currentBusinessType, CancellationToken cancellationToken)
+    private async Task<NextStepOption> GetDynamicStepAsync(EDynamicPolicy policy, CancellationToken cancellationToken)
     {
         int orgLevel;
         List<Kv> items;
-        EFlowDirection flowDirection;
         var levelOneOrgCode = _sessionContext.RequiredOrgId.GetHigherOrgCode();
         switch (policy)
         {
@@ -967,7 +964,6 @@ public class WorkflowApplication : IWorkflowApplication, IScopeDependency
                         .Where(d => d.IsCenter)
                         .Select(d => new Kv { Key = d.Id, Value = d.Name })
                         .ToListAsync(cancellationToken);
-                    flowDirection = 
                 }
                 else
                 {
@@ -975,7 +971,6 @@ public class WorkflowApplication : IWorkflowApplication, IScopeDependency
                         .Where(d => !d.IsCenter && d.Level == orgLevel && d.Id.StartsWith(levelOneOrgCode))
                         .Select(d => new Kv { Key = d.Id, Value = d.Name })
                         .ToListAsync(cancellationToken);
-                    businessType = EBusinessType.Department;
                 }
 
                 break;
@@ -986,11 +981,6 @@ public class WorkflowApplication : IWorkflowApplication, IScopeDependency
                     .Where(d => d.Level == orgLevel && d.Id.StartsWith(levelOneOrgCode))
                     .Select(d => new Kv { Key = d.Id, Value = d.Name })
                     .ToListAsync(cancellationToken);
-                businessType = _sessionContext.OrgIsCenter
-                    ? EBusinessType.Center
-                    : _sessionContext.OrgLevel == 1
-                        ? EBusinessType.Center
-                        : EBusinessType.Department;
                 break;
             case EDynamicPolicy.OrgDownCenterTop:
                 if (_sessionContext.OrgIsCenter)
@@ -1010,7 +1000,6 @@ public class WorkflowApplication : IWorkflowApplication, IScopeDependency
                         .ToListAsync(cancellationToken);
                 }
 
-                businessType = EBusinessType.Department;
                 break;
             case EDynamicPolicy.OrgDown:
                 orgLevel = _sessionContext.OrgLevel + 1;
@@ -1018,7 +1007,6 @@ public class WorkflowApplication : IWorkflowApplication, IScopeDependency
                     .Where(d => d.Level == orgLevel && d.Id.StartsWith(levelOneOrgCode))
                     .Select(d => new Kv { Key = d.Id, Value = d.Name })
                     .ToListAsync(cancellationToken);
-                businessType = EBusinessType.Department;
                 break;
             default:
                 throw new ArgumentOutOfRangeException(nameof(policy), policy, null);
@@ -1028,7 +1016,7 @@ public class WorkflowApplication : IWorkflowApplication, IScopeDependency
         {
             Key = orgLevel.ToString(),
             Value = orgLevel == 0 ? "热线中心" : $"{orgLevel.ToChinese()}级部门",
-            BusinessType = businessType,
+            FlowDirection = null,
             Items = items
         };
     }

+ 22 - 18
src/Hotline.Application/Handlers/FlowEngine/NextStepHandler.cs

@@ -86,6 +86,7 @@ public class NextStepHandler : INotificationHandler<NextStepNotify>
                 _mapper.Map(workflow, order);
 
 
+                //todo publish province
                 //var orderDto = _mapper.Map<OrderDto>(order);
                 //if (notification.IsCenterToOrg)
                 //    await _capPublisher.PublishAsync(EventNames.HotlineOrderExpiredTimeUpdate, orderDto, cancellationToken: cancellationToken);
@@ -97,27 +98,29 @@ public class NextStepHandler : INotificationHandler<NextStepNotify>
                 //        WorkflowTrace = _mapper.Map<WorkflowTraceDto>(notification.Trace)
                 //    }, cancellationToken: cancellationToken);
 
-                if (notification.FlowDirection is EFlowDirection.CenterToOrg or EFlowDirection.OrgToCenter)
+                //
+                if (data.FlowDirection.HasValue && data.External.TimeLimit.HasValue && data.External.TimeLimitUnit.HasValue)
                 {
                     //todo 1. calc expiredTime 2. update order.expiredTime 3. update workflow.expiredTime 4. publish province
                     //todo 1. calc expiredTime with 1 day 2. update order.expiredTime 3. update workflow.expiredTime 4. publish province
-                    TimeResult expiredTime;
-                    if (notification.FlowDirection is EFlowDirection.CenterToOrg)
-                    {
-                        expiredTime =
-                            _timeLimitDomainService.CalcEndTime(DateTime.Now, order.AcceptTypeCode, false);
-                        order.CenterToOrg(expiredTime.EndTime);
-                    }
-                    else
-                    {
-                        expiredTime = _timeLimitDomainService.CalcEndTime(DateTime.Now, ETimeType.Day, 1, true);
-                        order.OrgToCenter(expiredTime.EndTime);
-                    }
-                    //workflow.expiredTime
-                    //publish
-                    await _workflowDomainService.UpdateExpiredTimeAsync(expiredTime.EndTime, expiredTime.RuleStr, null, null, cancellationToken);
-                }
+                    //TimeResult expiredTime;
+                    //if (data.FlowDirection is EFlowDirection.CenterToOrg)
+                    //{
+                    //    expiredTime = _timeLimitDomainService.CalcEndTime(DateTime.Now, order.AcceptTypeCode, false);
+                    //    order.CenterToOrg(expiredTime.EndTime);
+                    //}
+                    //else
+                    //{
+                    //    expiredTime = _timeLimitDomainService.CalcEndTime(DateTime.Now, ETimeType.Day, 1, true);
+                    //    order.OrgToCenter(expiredTime.EndTime);
+                    //}
+                    var expiredTime = _timeLimitDomainService.CalcEndTime(DateTime.Now, data.External.TimeLimitUnit.Value,
+                        data.External.TimeLimit.Value, data.FlowDirection is EFlowDirection.OrgToCenter);
 
+                    await _workflowDomainService.UpdateExpiredTimeAsync(workflow, expiredTime.EndTime,
+                        expiredTime.RuleStr, data.External.TimeLimit, data.External.TimeLimitUnit, cancellationToken);
+                    //todo publish province
+                }
 
 
                 await _orderRepository.UpdateAsync(order, cancellationToken);
@@ -126,7 +129,8 @@ public class NextStepHandler : INotificationHandler<NextStepNotify>
             case WorkflowModuleConsts.KnowledgeUpdate:
             case WorkflowModuleConsts.KnowledgeDelete:
             case WorkflowModuleConsts.OrderScreen:
-                var screen = await _orderScreenRepository.Queryable().Includes(x => x.Order).Where(x => x.Id == workflow.ExternalId).FirstAsync(cancellationToken);
+                var screen = await _orderScreenRepository.Queryable().Includes(x => x.Order)
+                    .Where(x => x.Id == workflow.ExternalId).FirstAsync(cancellationToken);
                 if (screen != null)
                 {
                     screen.Status = EScreenStatus.Approval;

+ 4 - 8
src/Hotline.Share/Dtos/FlowEngine/BasicWorkflowDto.cs

@@ -1,4 +1,5 @@
 using Hotline.Share.Enums.FlowEngine;
+using Hotline.Share.Enums.Settings;
 
 namespace Hotline.Share.Dtos.FlowEngine;
 
@@ -18,10 +19,7 @@ public class BasicWorkflowDto : EndWorkflowDto
     /// </summary>
     public bool BackToCountersignEnd { get; set; }
 
-    /// <summary>
-    /// 节点业务类型
-    /// </summary>
-    public EBusinessType BusinessType { get; set; }
+    public EFlowDirection? FlowDirection { get; set; }
 
     /// <summary>
     /// 根据办理者类型不同,此字段为不同内容
@@ -55,8 +53,6 @@ public class BasicWorkflowDto : EndWorkflowDto
 
 public class External
 {
-    ///// <summary>
-    ///// 是否省延期
-    ///// </summary>
-    //public bool IsProvinceDelay { get; set; }
+    public int? TimeLimit { get; set; }
+    public ETimeType? TimeLimitUnit { get; set; }
 }

+ 3 - 3
src/Hotline.Share/Enums/FlowEngine/EFlowDirection.cs

@@ -6,9 +6,9 @@ public enum EFlowDirection
 
     OrgToCenter = 1,
 
-    CenterToCenter = 2,
+    //CenterToCenter = 2,
 
-    OrgToOrg = 3,
+    //OrgToOrg = 3,
 
-    CenterToFile = 4,
+    //CenterToFile = 4,
 }

+ 1 - 1
src/Hotline/FlowEngine/Notifications/WorkflowNotify.cs

@@ -11,7 +11,7 @@ public record WorkflowNotify(Workflow Workflow, BasicWorkflowDto Dto) : INotific
 public record StartWorkflowNotify(Workflow Workflow, BasicWorkflowDto Dto, FlowAssignInfo FlowAssignInfo) : WorkflowNotify(Workflow, Dto);
 
 public record NextStepNotify(Workflow Workflow, BasicWorkflowDto Dto, WorkflowTrace Trace, StepDefine NextStepDefine,
-    EFlowDirection FlowDirection, string HandlerOrgCode) : WorkflowNotify(Workflow, Dto);
+    string HandlerOrgCode) : WorkflowNotify(Workflow, Dto);
 
 public record AcceptWorkflowNotify(Workflow Workflow) : INotification;
 

+ 1 - 1
src/Hotline/FlowEngine/Workflows/IWorkflowDomainService.cs

@@ -115,7 +115,7 @@ namespace Hotline.FlowEngine.Workflows
         /// <summary>
         /// 更新期满时间
         /// </summary>
-        Task UpdateExpiredTimeAsync(DateTime expiredTime, string timelimitText, int? timelimie,
+        Task UpdateExpiredTimeAsync(Workflow workflow, DateTime expiredTime, string timelimitText, int? timelimite,
             ETimeType? timelimitUnit, CancellationToken cancellationToken);
     }
 }

+ 3 - 5
src/Hotline/FlowEngine/Workflows/StepBasicEntity.cs

@@ -3,6 +3,7 @@ using Hotline.FlowEngine.Definitions;
 using Hotline.Share.Dtos;
 using Hotline.Share.Dtos.FlowEngine;
 using Hotline.Share.Enums.FlowEngine;
+using Hotline.Share.Enums.Settings;
 using SqlSugar;
 using XF.Domain.Entities;
 using XF.Domain.Repository;
@@ -25,11 +26,6 @@ public abstract class StepBasicEntity : CreationEntity
     [SugarColumn(ColumnDataType = "json", IsJson = true)]
     public List<Kv> Handlers { get; set; } = new();
 
-    /// <summary>
-    /// 办理时间限制(如:24小时、7个工作日)
-    /// </summary>
-    public string? TimeLimit { get; set; }
-
     /// <summary>
     /// 上一节点办理时,nextStepCode下拉框中选中的值
     /// config模式:当前节点的difinition.code, dynamic模式:x级部门办理的x:int
@@ -208,6 +204,8 @@ public abstract class StepBasicEntity : CreationEntity
     /// </summary>
     public bool BackToCountersignEnd { get; set; }
 
+    public EFlowDirection? FlowDirection { get; set; }
+
     /// <summary>
     /// 是否短信通知
     /// </summary>

+ 12 - 27
src/Hotline/FlowEngine/Workflows/WorkflowDomainService.cs

@@ -400,29 +400,12 @@ namespace Hotline.FlowEngine.Workflows
 
             #endregion
 
-            var flowDirection = CheckFlowDirection(currentStep, dto);
             await _mediator.Publish(
-                new NextStepNotify(workflow, dto, trace, nextStepDefine, flowDirection, _sessionContext.RequiredOrgId),
+                new NextStepNotify(workflow, dto, trace, nextStepDefine, _sessionContext.RequiredOrgId),
                 cancellationToken);
 
         }
 
-        private EFlowDirection CheckFlowDirection(WorkflowStep currentStep, BasicWorkflowDto dto)
-        {
-            if (currentStep.BusinessType is EBusinessType.Center or EBusinessType.Send)
-            {
-                return dto.BusinessType is EBusinessType.Department or EBusinessType.File
-                    ? EFlowDirection.CenterToOrg
-                    : EFlowDirection.CenterToCenter;
-            }
-            else
-            {
-                return dto.BusinessType is EBusinessType.Center or EBusinessType.Send
-                    ? EFlowDirection.OrgToCenter
-                    : EFlowDirection.OrgToOrg;
-            }
-        }
-
         //更新目标节点前一节点的会签办理完成状态
         private void PrevStepCsHandled(Workflow workflow, WorkflowStep targetStep, ref List<WorkflowStep> updateSteps)
         {
@@ -889,10 +872,14 @@ namespace Hotline.FlowEngine.Workflows
         /// <summary>
         /// 更新期满时间
         /// </summary>
-        public async Task UpdateExpiredTimeAsync(DateTime expiredTime, string timelimitText, int? timelimie, ETimeType? timelimitUnit,
-            CancellationToken cancellationToken)
+        public async Task UpdateExpiredTimeAsync(Workflow workflow, DateTime expiredTime, string timelimitText, int? timelimite,
+            ETimeType? timelimitUnit, CancellationToken cancellationToken)
         {
-            throw new NotImplementedException();
+            workflow.ExpiredTime = expiredTime;
+            workflow.TimeLimit = timelimite;
+            workflow.TimeLimitUnit = timelimitUnit;
+            workflow.TimeLimitText = timelimitText;
+            await _workflowRepository.UpdateAsync(workflow, cancellationToken);
         }
 
         #region private method
@@ -1297,7 +1284,7 @@ namespace Hotline.FlowEngine.Workflows
 
             var step = CreateStep(endStepDefine, prevStep, workflow.Id, null, new List<Kv> { handler },
                 null, null, null, EWorkflowStepStatus.WaitForAccept, ECountersignPosition.None, DateTime.Now,
-                endStepDefine.Name, true, EBusinessType.File);
+                endStepDefine.Name, true);
 
             //step.Accept(_sessionContext.RequiredUserId, _sessionContext.UserName,
             //    _sessionContext.RequiredOrgId, _sessionContext.OrgName,
@@ -1365,7 +1352,7 @@ namespace Hotline.FlowEngine.Workflows
                 {
                     var step = CreateStep(stepDefine, prevStep, workflow.Id, flowAssignType, new List<Kv> { handler },
                         dto.NextStepCode, dto.NextMainHandler, countersignId,
-                        stepStatus, csPosition, expiredTime, dto.NextStepName, isOrigin, dto.BusinessType);
+                        stepStatus, csPosition, expiredTime, dto.NextStepName, isOrigin);
 
                     steps.Add(step);
                 }
@@ -1374,7 +1361,7 @@ namespace Hotline.FlowEngine.Workflows
             {
                 var step = CreateStep(stepDefine, prevStep, workflow.Id, flowAssignType, handlers,
                     dto.NextStepCode, dto.NextMainHandler, countersignId,
-                    stepStatus, csPosition, expiredTime, dto.NextStepName, isOrigin, dto.BusinessType);
+                    stepStatus, csPosition, expiredTime, dto.NextStepName, isOrigin);
 
                 steps.Add(step);
             }
@@ -1420,8 +1407,7 @@ namespace Hotline.FlowEngine.Workflows
             ECountersignPosition countersignPosition,
             DateTime expiredTime,
             string stepName,
-            bool isOrigin,
-            EBusinessType businessType
+            bool isOrigin
             )
         {
             if (!handlers.Any())
@@ -1444,7 +1430,6 @@ namespace Hotline.FlowEngine.Workflows
             //step.TimeLimit = GetTimeLimit("");
             step.IsOrigin = isOrigin;
             step.Name = stepName;
-            step.BusinessType = businessType;
 
             return step;
         }