xf 2 éve
szülő
commit
9b5d262507

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

@@ -18,7 +18,6 @@ public class WorkflowApplication : IWorkflowApplication, IScopeDependency
     private readonly IWorkflowDomainService _workflowDomainService;
     private readonly IWorkflowRepository _workflowRepository;
     private readonly IUserRepository _userRepository;
-    private readonly IWorkflowBusinessRepository _workflowBusinessRepository;
     private readonly ISessionContext _sessionContext;
 
     public WorkflowApplication(
@@ -26,14 +25,12 @@ public class WorkflowApplication : IWorkflowApplication, IScopeDependency
         IWorkflowDomainService workflowDomainService,
         IWorkflowRepository workflowRepository,
         IUserRepository userRepository,
-        IWorkflowBusinessRepository workflowBusinessRepository,
         ISessionContext sessionContext)
     {
         _definitionDomainService = definitionDomainService;
         _workflowDomainService = workflowDomainService;
         _workflowRepository = workflowRepository;
         _userRepository = userRepository;
-        _workflowBusinessRepository = workflowBusinessRepository;
         _sessionContext = sessionContext;
     }
 

+ 23 - 2
src/Hotline.Application/Handlers/FlowEngine/NextStepHandler.cs

@@ -1,16 +1,37 @@
 using Hotline.FlowEngine.Notifies;
+using Hotline.Orders;
+using Hotline.Settings;
 using MediatR;
+using XF.Domain.Exceptions;
 
 namespace Hotline.Application.Handlers.FlowEngine;
 
 public class NextStepHandler : INotificationHandler<NextStepNotify>
 {
+    private readonly IOrderRepository _orderRepository;
+
+    public NextStepHandler(IOrderRepository orderRepository)
+    {
+        _orderRepository = orderRepository;
+    }
+
     /// <summary>Handles a notification</summary>
     /// <param name="notification">The notification</param>
     /// <param name="cancellationToken">Cancellation token</param>
     public async Task Handle(NextStepNotify notification, CancellationToken cancellationToken)
     {
-        //todo 1.query order 2.add depcode to assignDepCodes, userId
-        throw new NotImplementedException();
+        var workflow = notification.Workflow;
+        var data = notification.Dto;
+        switch (workflow.ModuleCode)
+        {
+            case WorkflowModuleConsts.Order:
+                var order = await _orderRepository.GetAsync(d => d.WorkflowId == workflow.Id, cancellationToken);
+                if (order == null)
+                    throw new UserFriendlyException($"工单审批流程Id无效, workflowId: {workflow.Id}", "无效流程编号");
+                order.Assign(notification.FlowAssignType, data.Handlers);
+
+                //todo business logic
+                break;
+        }
     }
 }

+ 1 - 1
src/Hotline.Repository.SqlSugar/DataPermissions/DataPermissionFilterBuilder.cs

@@ -61,7 +61,7 @@ public class DataPermissionFilterBuilder : IDataPermissionFilterBuilder, IScopeD
     private static bool FlowDataFiltering<TEntity>(TEntity entity, string userId, string depCode) where TEntity : class, IEntity<string>, IDataPermission, IWorkflow, new()
     {
         if (entity.AssignUserIds.Contains(userId)) return true;
-        foreach (var assignDepCode in entity.AssignDepCodes)
+        foreach (var assignDepCode in entity.AssignOrgCodes)
         {
             if (assignDepCode == depCode) return true;
             var baseDep = assignDepCode.Substring(0, 3);

+ 2 - 1
src/Hotline.Repository.SqlSugar/Orders/OrderRepository.cs

@@ -6,10 +6,11 @@ using System.Threading.Tasks;
 using Hotline.Orders;
 using Hotline.Repository.SqlSugar.DataPermissions;
 using SqlSugar;
+using XF.Domain.Dependency;
 
 namespace Hotline.Repository.SqlSugar.Orders
 {
-    public class OrderRepository : BaseRepositoryWorkflow<Order>, IOrderRepository
+    public class OrderRepository : BaseRepositoryWorkflow<Order>, IOrderRepository, IScopeDependency
     {
         public OrderRepository(ISugarUnitOfWork<HotlineDbContext> uow, IDataPermissionFilterBuilder dataPermissionFilterBuilder) : base(uow, dataPermissionFilterBuilder)
         {

+ 0 - 19
src/Hotline.Repository.SqlSugar/System/WorkflowBusinessRepository.cs

@@ -1,19 +0,0 @@
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Text;
-using System.Threading.Tasks;
-using Hotline.Repository.SqlSugar.DataPermissions;
-using Hotline.Settings;
-using SqlSugar;
-using XF.Domain.Dependency;
-
-namespace Hotline.Repository.SqlSugar.System
-{
-    public class WorkflowBusinessRepository : BaseRepository<WorkflowModule>, IWorkflowBusinessRepository, IScopeDependency
-    {
-        public WorkflowBusinessRepository(ISugarUnitOfWork<HotlineDbContext> uow, IDataPermissionFilterBuilder dataPermissionFilterBuilder) : base(uow, dataPermissionFilterBuilder)
-        {
-        }
-    }
-}

+ 6 - 3
src/Hotline/FlowEngine/Definitions/Definition.cs

@@ -33,14 +33,17 @@ public class Definition : CreationEntity
 
     public EDefinitionStatus Status { get; set; }
 
-    public string ModuleId { get; set; }
+    [SugarColumn(IsNullable = true)]
+    public string? ModuleId { get; set; }
 
     /// <summary>
     /// 业务模块名称
     /// </summary>
-    public string ModuleName { get; set; }
+    [SugarColumn(IsNullable = true)]
+    public string? ModuleName { get; set; }
 
-    public string ModuleCode { get; set; }
+    [SugarColumn(IsNullable = true)]
+    public string? ModuleCode { get; set; }
 
     #region Method
 

+ 17 - 1
src/Hotline/FlowEngine/Definitions/StepDefine.cs

@@ -1,4 +1,7 @@
-namespace Hotline.FlowEngine.Definitions;
+using Hotline.Share.Enums.FlowEngine;
+using XF.Domain.Entities;
+
+namespace Hotline.FlowEngine.Definitions;
 
 /// <summary>
 /// 模板定义节点
@@ -6,4 +9,17 @@
 public class StepDefine : StepBasic
 {
     public List<NextStepDefine> NextSteps { get; set; }
+
+    public EFlowAssignType GFlowAssignType()
+    {
+        return HandlerType switch
+        {
+            EHandlerType.Role => EFlowAssignType.User,
+            EHandlerType.OrgLevel => EFlowAssignType.Org,
+            EHandlerType.OrgType => EFlowAssignType.Org,
+            EHandlerType.AssignUser => EFlowAssignType.User,
+            EHandlerType.AssignOrg => EFlowAssignType.Org,
+            _ => throw new ArgumentOutOfRangeException()
+        };
+    }
 }

+ 0 - 39
src/Hotline/FlowEngine/Notifies/NextStepNotify.cs

@@ -1,39 +0,0 @@
-using Hotline.FlowEngine.Workflows;
-using Hotline.Share.Dtos.FlowEngine;
-using MediatR;
-
-namespace Hotline.FlowEngine.Notifies
-{
-    public class WorkflowNotify : INotification
-    {
-        public Workflow Workflow { get; set; }
-    }
-
-    public class StartWorkflowNotify : WorkflowNotify
-    {
-        public BasicWorkflowDto Dto { get; set; }
-    }
-
-    public class AcceptWorkflowNotify : WorkflowNotify
-    {
-
-    }
-
-    public class NextStepNotify : WorkflowNotify
-    {
-        public BasicWorkflowDto Dto { get; set; }
-    }
-
-    /// <summary>
-    /// 汇总节点可接办
-    /// </summary>
-    public class CountersignEndAssigned : WorkflowNotify
-    {
-
-    }
-
-
-
-    public record PreviousStepNotify(PreviousWorkflowDto Data) : INotification;
-
-}

+ 18 - 0
src/Hotline/FlowEngine/Notifies/WorkflowNotify.cs

@@ -0,0 +1,18 @@
+using Hotline.FlowEngine.Workflows;
+using Hotline.Share.Dtos.FlowEngine;
+using MediatR;
+using XF.Domain.Entities;
+
+namespace Hotline.FlowEngine.Notifies;
+
+public record WorkflowNotify(Workflow Workflow, EFlowAssignType FlowAssignType) : INotification;
+
+public record StartWorkflowNotify(Workflow Workflow, EFlowAssignType FlowAssignType, BasicWorkflowDto Dto) : WorkflowNotify(Workflow, FlowAssignType);
+
+public record NextStepNotify(Workflow Workflow, EFlowAssignType FlowAssignType, BasicWorkflowDto Dto) : WorkflowNotify(Workflow, FlowAssignType);
+
+public record AcceptWorkflowNotify(Workflow Workflow) : INotification;
+
+public record CountersignEndAssigned(Workflow Workflow) : INotification;
+
+public record PreviousStepNotify(PreviousWorkflowDto Data) : INotification;

+ 11 - 3
src/Hotline/FlowEngine/Workflows/Workflow.cs

@@ -9,9 +9,17 @@ public class Workflow : CreationEntity
 {
     public string DefinitionId { get; set; }
 
-    public string ModuleId { get; set; }
-    public string ModuleName { get; set; }
-    public string ModuleCode { get; set; }
+    [SugarColumn(IsNullable = true)]
+    public string? ModuleId { get; set; }
+
+    /// <summary>
+    /// 业务模块名称
+    /// </summary>
+    [SugarColumn(IsNullable = true)]
+    public string? ModuleName { get; set; }
+
+    [SugarColumn(IsNullable = true)]
+    public string? ModuleCode { get; set; }
 
     public string Title { get; set; }
 

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

@@ -85,7 +85,7 @@ namespace Hotline.FlowEngine.Workflows
             await CreateStepAsync(workflow, nextStepBoxDefine, dto, cancellationToken: cancellationToken);
 
             //publish
-            await _mediator.Publish(new StartWorkflowNotify { Workflow = workflow, Dto = dto }, cancellationToken);
+            await _mediator.Publish(new StartWorkflowNotify(workflow, nextStepBoxDefine.GFlowAssignType(), dto), cancellationToken);
         }
 
         public async Task<Workflow> GetWorkflowAsync(string workflowId,
@@ -153,7 +153,7 @@ namespace Hotline.FlowEngine.Workflows
 
             await AcceptTraceAsync(workflow, currentStepBox, currentStep, cancellationToken);
 
-            await _mediator.Publish(new AcceptWorkflowNotify { Workflow = workflow }, cancellationToken);
+            await _mediator.Publish(new AcceptWorkflowNotify(workflow), cancellationToken);
         }
 
         /// <summary>
@@ -256,14 +256,14 @@ namespace Hotline.FlowEngine.Workflows
                     if (canHandle)
                     {
                         await UpdateNextCountersignEndAssignedAsync(nextStepBox, currentStep, cancellationToken);
-                        await _mediator.Publish(new CountersignEndAssigned { Workflow = workflow }, cancellationToken);
+                        await _mediator.Publish(new CountersignEndAssigned(workflow), cancellationToken);
                     }
 
                 }
                 else
                 {
                     await UpdateNextCountersignEndAssignedAsync(nextStepBox, currentStep, cancellationToken);
-                    await _mediator.Publish(new CountersignEndAssigned { Workflow = workflow }, cancellationToken);
+                    await _mediator.Publish(new CountersignEndAssigned(workflow), cancellationToken);
                 }
             }
 
@@ -280,7 +280,7 @@ namespace Hotline.FlowEngine.Workflows
 
             #endregion
 
-            await _mediator.Publish(new NextStepNotify { Workflow = workflow, Dto = dto }, cancellationToken);
+            await _mediator.Publish(new NextStepNotify(workflow, nextStepBoxDefine.GFlowAssignType(), dto), cancellationToken);
         }
 
         /// <summary>

+ 0 - 13
src/Hotline/Settings/IWorkflowBusinessRepository.cs

@@ -1,13 +0,0 @@
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Text;
-using System.Threading.Tasks;
-using XF.Domain.Repository;
-
-namespace Hotline.Settings
-{
-    public interface IWorkflowBusinessRepository : IRepository<WorkflowModule>
-    {
-    }
-}

+ 26 - 5
src/Hotline/Settings/WorkflowModule.cs

@@ -13,12 +13,33 @@ namespace Hotline.Settings;
 /// <summary>
 /// 工作流业务模块
 /// </summary>
-[SugarIndex("unique_account_username", nameof(WorkflowModule.Code), OrderByType.Asc, true)]
-public class WorkflowModule : CreationEntity
+//[SugarIndex("unique_account_username", nameof(WorkflowModule.Code), OrderByType.Asc, true)]
+//public class WorkflowModule : CreationEntity
+//{
+//    public string Name { get; set; }
+
+//    public string Code { get; set; }
+
+//    public string DefinitionCode { get; set; }
+//}
+
+public class WorkflowModule
 {
-    public string Name { get; set; }
+    public WorkflowModule()
+    {
+        Modules = new Dictionary<string, string>
+        {
+            { WorkflowModuleConsts.Order, "工单审批" },
+        };
+    }
 
-    public string Code { get; set; }
+    public Dictionary<string, string> Modules { get; init; }
+}
 
-    public string DefinitionCode { get; set; }
+public class WorkflowModuleConsts
+{
+    /// <summary>
+    /// 工单审批
+    /// </summary>
+    public const string Order = "Order";
 }

+ 66 - 6
src/XF.Domain.Repository/Entity.cs

@@ -139,11 +139,41 @@ public abstract class WorkflowEntity : FullStateEntity, IWorkflow
     [SugarColumn(IsNullable = true)]
     public string? WorkflowId { get; set; }
 
-    [SugarColumn(ColumnDataType = "varchar(4000)", IsJson = true)]
-    public List<string> AssignDepCodes { get; set; } = new();
+    [SugarColumn(ColumnDataType = "varchar(2000)", IsJson = true)]
+    public List<string> AssignOrgCodes { get; set; } = new();
 
-    [SugarColumn(ColumnDataType = "varchar(4000)", IsJson = true)]
+    [SugarColumn(ColumnDataType = "varchar(2000)", IsJson = true)]
     public List<string> AssignUserIds { get; set; } = new();
+
+    public void Assign(EFlowAssignType type, string id)
+    {
+        switch (type)
+        {
+            case EFlowAssignType.Org:
+                AssignOrgCodes.Add(id);
+                break;
+            case EFlowAssignType.User:
+                AssignUserIds.Add(id);
+                break;
+            default:
+                throw new ArgumentOutOfRangeException(nameof(type), type, null);
+        }
+    }
+
+    public void Assign(EFlowAssignType type, IEnumerable<string> ids)
+    {
+        switch (type)
+        {
+            case EFlowAssignType.Org:
+                AssignOrgCodes.AddRange(ids);
+                break;
+            case EFlowAssignType.User:
+                AssignUserIds.AddRange(ids);
+                break;
+            default:
+                throw new ArgumentOutOfRangeException(nameof(type), type, null);
+        }
+    }
 }
 
 public abstract class PositionEntity : FullStateEntity
@@ -187,9 +217,39 @@ public abstract class PositionWorkflowEntity : PositionEntity, IWorkflow
     [SugarColumn(IsNullable = true)]
     public string? WorkflowId { get; set; }
 
-    [SugarColumn(ColumnDataType = "varchar(3000)", IsJson = true)]
-    public List<string> AssignDepCodes { get; set; } = new();
+    [SugarColumn(ColumnDataType = "varchar(2000)", IsJson = true)]
+    public List<string> AssignOrgCodes { get; set; } = new();
 
-    [SugarColumn(ColumnDataType = "varchar(3000)", IsJson = true)]
+    [SugarColumn(ColumnDataType = "varchar(2000)", IsJson = true)]
     public List<string> AssignUserIds { get; set; } = new();
+
+    public void Assign(EFlowAssignType type, string id)
+    {
+        switch (type)
+        {
+            case EFlowAssignType.Org:
+                AssignOrgCodes.Add(id);
+                break;
+            case EFlowAssignType.User:
+                AssignUserIds.Add(id);
+                break;
+            default:
+                throw new ArgumentOutOfRangeException(nameof(type), type, null);
+        }
+    }
+
+    public void Assign(EFlowAssignType type, IEnumerable<string> ids)
+    {
+        switch (type)
+        {
+            case EFlowAssignType.Org:
+                AssignOrgCodes.AddRange(ids);
+                break;
+            case EFlowAssignType.User:
+                AssignUserIds.AddRange(ids);
+                break;
+            default:
+                throw new ArgumentOutOfRangeException(nameof(type), type, null);
+        }
+    }
 }

+ 23 - 1
src/XF.Domain/Entities/IDataPermission.cs

@@ -17,10 +17,32 @@ namespace XF.Domain.Entities
     public interface IWorkflow
     {
         string? WorkflowId { get; set; }
+
         /// <summary>
         /// 指派部门编码
         /// </summary>
-        List<string> AssignDepCodes { get; set; }
+        List<string> AssignOrgCodes { get; set; }
+
+        /// <summary>
+        /// 指派用户Id
+        /// </summary>
         List<string> AssignUserIds { get; set; }
+
+        void Assign(EFlowAssignType type, string id);
+
+        void Assign(EFlowAssignType type, IEnumerable<string> ids);
+    }
+
+    public enum EFlowAssignType
+    {
+        /// <summary>
+        /// 指派到部门
+        /// </summary>
+        Org = 0,
+
+        /// <summary>
+        /// 指派到用户
+        /// </summary>
+        User = 1,
     }
 }