浏览代码

流程策略更改

田爽 8 月之前
父节点
当前提交
7ab722f213

+ 139 - 4
src/Hotline.Application/FlowEngine/WorkflowApplication.cs

@@ -1143,10 +1143,145 @@ public class WorkflowApplication : IWorkflowApplication, IScopeDependency
         };
     }
 
-    /// <summary>
-    /// 查询下一节点办理对象类型(user or org)及实际办理对象
-    /// </summary>
-    public async Task<FlowAssignInfo> GetNextStepFlowAssignInfoAsync(Workflow workflow, WorkflowStep currentStep,
+
+	private async Task<NextStepOption> GetDynamicStepAsync(
+		EDynamicPolicyCountersign policy, EStepType stepType,
+		EBusinessType currentBusinessType, CancellationToken cancellationToken)
+	{
+		int orgLevel;
+		List<FlowStepHandler> items;
+		string upperOrgId;
+		EBusinessType businessType;
+		EFlowDirection? flowDirection = null;
+		switch (policy)
+		{
+			case EDynamicPolicyCountersign.OrgUpCenterTop:
+				orgLevel = _sessionContext.OrgLevel - 1;
+				if (orgLevel < 0) orgLevel = 0;
+
+				if (orgLevel == 0)
+				{
+					businessType = EBusinessType.Send;
+					if (currentBusinessType == EBusinessType.Department)
+						flowDirection = EFlowDirection.OrgToCenter;
+
+					items = await _organizeRepository.Queryable()
+						.Where(d => d.IsCenter)
+						.Select(d => new FlowStepHandler
+						{
+							Key = d.Id,
+							Value = d.Name,
+							OrgId = d.Id,
+							OrgName = d.Name
+						})
+						.ToListAsync(cancellationToken);
+				}
+				else
+				{
+					businessType = EBusinessType.Department;
+
+					//上级部门Id
+					upperOrgId = _sessionContext.RequiredOrgId.GetHigherOrgId(orgLevel);
+					items = await _organizeRepository.Queryable()
+						.Where(d => d.Id == upperOrgId)
+						.Select(d => new FlowStepHandler
+						{
+							Key = d.Id,
+							Value = d.Name,
+							OrgId = d.Id,
+							OrgName = d.Name
+						})
+						.ToListAsync(cancellationToken);
+				}
+
+				break;
+			case EDynamicPolicyCountersign.OrgUp:
+				businessType = _sessionContext.OrgIsCenter
+					? EBusinessType.Send
+					: _sessionContext.RequiredOrgId.CalcOrgLevel() == 1
+						? EBusinessType.Send
+						: EBusinessType.Department;
+				orgLevel = _sessionContext.OrgLevel - 1;
+				if (orgLevel <= 0) orgLevel = 1;
+				//上级部门Id
+				upperOrgId = _sessionContext.RequiredOrgId.GetHigherOrgId(orgLevel);
+				items = await _organizeRepository.Queryable()
+					.Where(d => d.Id == upperOrgId)
+					.Select(d => new FlowStepHandler
+					{
+						Key = d.Id,
+						Value = d.Name,
+						OrgId = d.Id,
+						OrgName = d.Name
+					})
+					.ToListAsync(cancellationToken);
+				break;
+			case EDynamicPolicyCountersign.OrgDownCenterTop:
+				businessType = EBusinessType.Department;
+				if (_sessionContext.OrgIsCenter)
+				{
+					orgLevel = 1;
+					items = await _organizeRepository.Queryable()
+						.Where(d => !d.IsCenter && d.Level == orgLevel)
+						.Select(d => new FlowStepHandler
+						{
+							Key = d.Id,
+							Value = d.Name,
+							OrgId = d.Id,
+							OrgName = d.Name
+						})
+						.ToListAsync(cancellationToken);
+				}
+				else
+				{
+					orgLevel = _sessionContext.OrgLevel + 1;
+					items = await _organizeRepository.Queryable()
+						.Where(d => !d.IsCenter && d.Level == orgLevel &&
+									d.Id.StartsWith(_sessionContext.RequiredOrgId))
+						.Select(d => new FlowStepHandler
+						{
+							Key = d.Id,
+							Value = d.Name,
+							OrgId = d.Id,
+							OrgName = d.Name
+						})
+						.ToListAsync(cancellationToken);
+				}
+
+				break;
+			case EDynamicPolicyCountersign.OrgDown:
+				businessType = EBusinessType.Department;
+				orgLevel = _sessionContext.OrgLevel + 1;
+				items = await _organizeRepository.Queryable()
+					.Where(d => d.Level == orgLevel && d.Id.StartsWith(_sessionContext.RequiredOrgId))
+					.Select(d => new FlowStepHandler
+					{
+						Key = d.Id,
+						Value = d.Name,
+						OrgId = d.Id,
+						OrgName = d.Name
+					})
+					.ToListAsync(cancellationToken);
+				break;
+			default:
+				throw new ArgumentOutOfRangeException(nameof(policy), policy, null);
+		}
+
+		return new NextStepOption
+		{
+			Key = orgLevel.ToString(),
+			Value = orgLevel == 0 ? "市民热线服务中心" : $"{orgLevel.ToChinese()}级部门",
+			FlowDirection = flowDirection,
+			StepType = stepType,
+			BusinessType = businessType,
+			HandlerType = EHandlerType.OrgLevel, //目前所有动态策略均属于部门等级
+			Items = items
+		};
+	}
+	/// <summary>
+	/// 查询下一节点办理对象类型(user or org)及实际办理对象
+	/// </summary>
+	public async Task<FlowAssignInfo> GetNextStepFlowAssignInfoAsync(Workflow workflow, WorkflowStep currentStep,
         BasicWorkflowDto dto, StepDefine nextStepDefine, bool isNextDynamic, CancellationToken cancellationToken)
     {
         if (nextStepDefine.StepType is EStepType.End) return new();

+ 1 - 1
src/Hotline.Share/Dtos/FlowEngine/Definition/StepDefineBasic.cs

@@ -63,7 +63,7 @@ namespace Hotline.Share.Dtos.FlowEngine.Definition
         /// <summary>
         /// 会签策略
         /// </summary>
-        public EDynamicPolicy? CountersignPolicy { get; set; }
+        public EDynamicPolicyCountersign? CountersignPolicy { get; set; }
 
         #endregion
         

+ 1 - 1
src/Hotline.Share/Dtos/FlowEngine/Workflow/StepBasicDto.cs

@@ -136,7 +136,7 @@ namespace Hotline.Share.Dtos.FlowEngine.Workflow
         /// <summary>
         /// 会签策略
         /// </summary>
-        public EDynamicPolicy? CountersignPolicy { get; set; }
+        public EDynamicPolicyCountersign? CountersignPolicy { get; set; }
 
         #endregion
 

+ 33 - 0
src/Hotline.Share/Enums/FlowEngine/EDynamicPolicyCountersign.cs

@@ -0,0 +1,33 @@
+using System.ComponentModel;
+
+namespace Hotline.Share.Enums.FlowEngine;
+
+/// <summary>
+/// 动态实例化策略
+/// </summary>
+public enum EDynamicPolicyCountersign
+{
+    /// <summary>
+    /// 直属上级部门(中心作为顶级部门)
+    /// </summary>
+    [Description("直属上级(中心作为顶级部门)")]
+    OrgUpCenterTop = 0,
+
+    /// <summary>
+    /// 直属上级(中心作为一级部门)
+    /// </summary>
+    [Description("直属上级(中心作为一级部门)")]
+    OrgUp = 1,
+
+    /// <summary>
+    /// 直属下级部门(中心作为顶级部门)
+    /// </summary>
+    [Description("直属下级(中心作为顶级部门)")]
+    OrgDownCenterTop = 2,
+
+    /// <summary>
+    /// 直属下级(中心作为一级部门)
+    /// </summary>
+    [Description("直属下级(中心作为一级部门)")]
+    OrgDown = 3,
+}

+ 6 - 0
src/Hotline.Share/Enums/FlowEngine/EHandlerType.cs

@@ -33,4 +33,10 @@ public enum EHandlerType
     /// </summary>
     [Description("指定部门")]
     AssignedOrg = 4,
+
+    /// <summary>
+    /// 指定部门与角色
+    /// </summary>
+    [Description("指定部门与角色")]
+	AssignedOrgOrRole = 5,
 }

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

@@ -267,7 +267,7 @@ public abstract class StepBasicEntity : CreationEntity
     /// <summary>
     /// 会签策略
     /// </summary>
-    public EDynamicPolicy? CountersignPolicy { get; set; }
+    public EDynamicPolicyCountersign? CountersignPolicy { get; set; }
 
     #endregion
 

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

@@ -1788,10 +1788,10 @@ namespace Hotline.FlowEngine.Workflows
 
             var handlerType = stepDefine.CountersignPolicy switch
             {
-                EDynamicPolicy.OrgUpCenterTop => EHandlerType.OrgLevel,
-                EDynamicPolicy.OrgUp => EHandlerType.OrgLevel,
-                EDynamicPolicy.OrgDownCenterTop => EHandlerType.OrgLevel,
-                EDynamicPolicy.OrgDown => EHandlerType.OrgLevel,
+	            EDynamicPolicyCountersign.OrgUpCenterTop => EHandlerType.OrgLevel,
+	            EDynamicPolicyCountersign.OrgUp => EHandlerType.OrgLevel,
+	            EDynamicPolicyCountersign.OrgDownCenterTop => EHandlerType.OrgLevel,
+	            EDynamicPolicyCountersign.OrgDown => EHandlerType.OrgLevel,
                 null => throw new ArgumentOutOfRangeException(),
                 _ => throw new ArgumentOutOfRangeException()
             };