xf 2 年之前
父節點
當前提交
e4b25cc57c

+ 3 - 2
src/Hotline.Application/FlowEngine/WorkflowApplication.cs

@@ -67,7 +67,8 @@ public class WorkflowApplication : IWorkflowApplication, IScopeDependency
             throw new UserFriendlyException("该模板不可用");
 
         var nextStepBoxDefine = _workflowDomainService.GetStepBoxDefine(definition, dto.NextStepCode);
-        var workflow = await _workflowDomainService.CreateWorkflowAsync(definition, dto.Title, externalId, cancellationToken);
+        var workflow = await _workflowDomainService.CreateWorkflowAsync(definition, dto.Title,
+            _sessionContext.RequiredUserId, _sessionContext.RequiredOrgCode, externalId, cancellationToken);
 
         var isStartCountersign = nextStepBoxDefine.CouldPrevStartCountersign(dto.NextHandlers.Count);
 
@@ -144,7 +145,7 @@ public class WorkflowApplication : IWorkflowApplication, IScopeDependency
         var startStep = definition.Steps.FirstOrDefault(d => d.StepType == EStepType.Start);
         if (startStep == null)
             throw new UserFriendlyException("未正确配置开始节点");
-        var nextStepDefines = definition.FindSteps(startStep.NextSteps.Select(d=>d.Code));
+        var nextStepDefines = definition.FindSteps(startStep.NextSteps.Select(d => d.Code));
 
         return new DefineWithSelectionStepsDto
         {

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

@@ -7,7 +7,7 @@ namespace Hotline.FlowEngine.Workflows
 {
     public interface IWorkflowDomainService
     {
-        Task<Workflow> CreateWorkflowAsync(Definition definition, string title, string? externalId = null, CancellationToken cancellationToken = default);
+        Task<Workflow> CreateWorkflowAsync(Definition definition, string title, string userId, string userCode, string? externalId = null, CancellationToken cancellationToken = default);
 
         /// <summary>
         /// 进行流程的开始节点

+ 51 - 0
src/Hotline/FlowEngine/Workflows/Workflow.cs

@@ -4,6 +4,7 @@ using Hotline.Share.Enums.FlowEngine;
 using SqlSugar;
 using XF.Domain.Entities;
 using XF.Domain.Exceptions;
+using XF.Domain.Extensions;
 using XF.Domain.Repository;
 
 namespace Hotline.FlowEngine.Workflows;
@@ -89,6 +90,18 @@ public class Workflow : CreationEntity
     [SugarColumn(ColumnDataType = "json", IsJson = true)]
     public List<HandlerGroupItem> HandlerOrgs { get; set; } = new();
 
+    /// <summary>
+    /// 指派部门code(所有流经部门留痕)
+    /// </summary>
+    [SugarColumn(ColumnDataType = "json", IsJson = true)]
+    public List<string> AssignOrgCodes { get; set; } = new();
+
+    /// <summary>
+    /// 指派办理人Id(所有流经办理人留痕)
+    /// </summary>
+    [SugarColumn(ColumnDataType = "json", IsJson = true)]
+    public List<string> AssignUserIds { get; set; } = new();
+
     /// <summary>
     /// 外部业务唯一标识
     /// </summary>
@@ -286,6 +299,44 @@ public class Workflow : CreationEntity
         }
     }
 
+    public void Assign(EFlowAssignType type, string handler)
+    {
+        handler = handler.ToLower();
+        switch (type)
+        {
+            case EFlowAssignType.Org:
+                var orgCodes = handler.GetHigherOrgCodes(true).ToList();
+                AssignOrgCodes.AddRange(orgCodes);
+                AssignOrgCodes = AssignOrgCodes.Distinct().ToList();
+                break;
+            case EFlowAssignType.User:
+                if (!AssignUserIds.Exists(d => d == handler))
+                    AssignUserIds.Add(handler);
+                break;
+            default:
+                throw new ArgumentOutOfRangeException(nameof(type), type, null);
+        }
+    }
+
+    public void Assign(EFlowAssignType type, IEnumerable<string> handlers)
+    {
+        handlers = handlers.Select(d => d.ToLower());
+        switch (type)
+        {
+            case EFlowAssignType.Org:
+                var orgCodes = handlers.SelectMany(d => d.GetHigherOrgCodes(true)).ToList();
+                AssignOrgCodes.AddRange(orgCodes);
+                AssignOrgCodes = AssignOrgCodes.Distinct().ToList();
+                break;
+            case EFlowAssignType.User:
+                AssignUserIds.AddRange(handlers);
+                AssignUserIds = AssignUserIds.Distinct().ToList();
+                break;
+            default:
+                throw new ArgumentOutOfRangeException(nameof(type), type, null);
+        }
+    }
+
     #endregion
 }
 

+ 10 - 1
src/Hotline/FlowEngine/Workflows/WorkflowDomainService.cs

@@ -54,7 +54,8 @@ namespace Hotline.FlowEngine.Workflows
             _logger = logger;
         }
 
-        public async Task<Workflow> CreateWorkflowAsync(Definition definition, string title, string? externalId, CancellationToken cancellationToken)
+        public async Task<Workflow> CreateWorkflowAsync(Definition definition, string title, string userId, string userCode, 
+            string? externalId = null, CancellationToken cancellationToken = default)
         {
             var workflow = new Workflow
             {
@@ -71,6 +72,8 @@ namespace Hotline.FlowEngine.Workflows
                 Definition = definition,
                 AssignTime = DateTime.Now,
                 ExternalId = externalId,
+                AssignOrgCodes = new List<string> { userCode },
+                AssignUserIds = new List<string> { userId },
             };
 
             await _workflowRepository.AddAsync(workflow, cancellationToken);
@@ -123,6 +126,9 @@ namespace Hotline.FlowEngine.Workflows
             workflow.UpdateHandlers(_sessionContext.RequiredUserId, _sessionContext.RequiredOrgCode,
             flowAssignMode.FlowAssignType, flowAssignMode.HandlerObjects);
 
+            //更新指派信息
+            workflow.Assign(flowAssignMode.FlowAssignType, flowAssignMode.GetHandlers());
+
             await _workflowRepository.UpdateAsync(workflow, cancellationToken);
 
             //publish
@@ -403,6 +409,9 @@ namespace Hotline.FlowEngine.Workflows
             //更新workflow当前节点名称、时间、会签节点code 等字段
             workflow.SetWorkflowCurrentStepInfo(isStartCountersign, nextStepBox);
 
+            //更新指派信息
+            workflow.Assign(flowAssignMode.FlowAssignType, flowAssignMode.GetHandlers());
+
             await _workflowRepository.UpdateAsync(workflow, cancellationToken);
 
             #endregion