From 26c753f135941954cb8256302983bf05cb3fba5e Mon Sep 17 00:00:00 2001 From: wintel Date: Tue, 19 Dec 2023 22:46:54 +0800 Subject: [PATCH] =?UTF-8?q?fix=20issue=20#I80UEX=20=E6=B5=81=E7=A8=8B?= =?UTF-8?q?=E8=AE=BE=E8=AE=A1=E5=8F=AF=E4=BB=A5=E9=80=89=E6=8B=A9=E7=9B=B4?= =?UTF-8?q?=E6=8E=A5=E4=B8=8A=E7=BA=A7=E5=92=8C=E9=83=A8=E9=97=A8=E8=B4=9F?= =?UTF-8?q?=E8=B4=A3=E4=BA=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- OpenAuth.App/Flow/FlowNode.cs | 280 +++++++++---------- OpenAuth.App/FlowInstance/FlowInstanceApp.cs | 71 ++--- 2 files changed, 179 insertions(+), 172 deletions(-) diff --git a/OpenAuth.App/Flow/FlowNode.cs b/OpenAuth.App/Flow/FlowNode.cs index 44d6073c..beac3d40 100644 --- a/OpenAuth.App/Flow/FlowNode.cs +++ b/OpenAuth.App/Flow/FlowNode.cs @@ -1,141 +1,141 @@ -namespace OpenAuth.App.Flow -{ - /// - /// 流程节点 - /// - public class FlowNode - { - public const string START = "start round mix"; - public const string END = "end round"; - public const string NODE = "node"; - public const string FORK = "fork"; //会签开始节点 - public const string JOIN = "join"; //会签结束节点 - - public string id { get; set; } - - public string name { get; set; } - - public string type { get; set; } - - public int left { get; set; } - public int top { get; set; } - - public int width { get; set; } - public int height { get; set; } - public bool alt { get; set; } - - /// - /// 节点的附加数据项 - /// - /// The set information. - public Setinfo setInfo { get; set; } - } - - public class Setinfo - { - public const string ALL_USER = "ALL_USER"; //所有用户 - public const string SPECIAL_ROLE = "SPECIAL_ROLE"; //指定角色 - public const string SPECIAL_USER = "SPECIAL_USER"; //指定用户 - /// - /// 连续多级直属上级 - /// 不同于钉钉的各上级部门负责人审批,OpenAuth以用户的各级直属上级审批模式 - /// - public const string RUNTIME_MANY_PARENTS = "RUNTIME_MANY_PARENTS"; - /// - /// 部门负责人 - /// - public const string RUNTIME_CHAIRMAN = "RUNTIME_CHAIRMAN"; - /// - /// 发起人直属上级 - /// - public const string RUNTIME_PARENT = "RUNTIME_PARENT"; - - public const string RUNTIME_SPECIAL_ROLE = "RUNTIME_SPECIAL_ROLE"; //运行时指定角色 - public const string RUNTIME_SPECIAL_USER = "RUNTIME_SPECIAL_USER"; //运行时指定用户 - - /// - /// 节点执行权限类型 - /// - public string NodeDesignate { get; set; } - - public Nodedesignatedata NodeDesignateData { get; set; } - public string NodeCode { get; set; } - public string NodeName { get; set; } - - /// - /// 流程执行时,三方回调的URL地址 - /// - public string ThirdPartyUrl { get; set; } - - /// - /// 驳回节点0"前一步"1"第一步"2"某一步" 3"不处理" - /// - public string NodeRejectType { get; set; } - - public int? Taged { get; set; } - public string UserName { get; set; } - public string UserId { get; set; } - public string Description { get; set; } - public string TagedTime { get; set; } - - //节点会签方式, - //all/空:默认为全部通过 - //one :至少有一个通过 - public string NodeConfluenceType { get; set; } - - /// - /// 会签通过的个数 - /// - public int? ConfluenceOk { get; set; } - - /// - /// 会签拒绝的个数 - /// - public int? ConfluenceNo { get; set; } - - /// - /// 可写的表单项ID - /// - public string[] CanWriteFormItemIds { get; set; } - } - - /// - /// 节点执行人 - /// - public class Nodedesignatedata - { - public string[] users { get; set; } - public string[] roles { get; set; } - public string[] orgs { get; set; } - } - - /// - /// 节点执行结果标签 - /// - public class Tag - { - /// - /// 1: 通过 - /// 2:不通过 - /// 3:驳回 - /// - public int Taged { get; set; } - - public string UserId { get; set; } - public string UserName { get; set; } - public string Description { get; set; } - public string TagedTime { get; set; } - } - - /// - /// 1: 通过 - /// 2:不通过 - /// 3:驳回 - /// - public enum TagState - { - Ok = 1, - No, - Reject - } +namespace OpenAuth.App.Flow +{ + /// + /// 流程节点 + /// + public class FlowNode + { + public const string START = "start round mix"; + public const string END = "end round"; + public const string NODE = "node"; + public const string FORK = "fork"; //会签开始节点 + public const string JOIN = "join"; //会签结束节点 + + public string id { get; set; } + + public string name { get; set; } + + public string type { get; set; } + + public int left { get; set; } + public int top { get; set; } + + public int width { get; set; } + public int height { get; set; } + public bool alt { get; set; } + + /// + /// 节点的附加数据项 + /// + /// The set information. + public Setinfo setInfo { get; set; } + } + + public class Setinfo + { + public const string ALL_USER = "ALL_USER"; //所有用户 + public const string SPECIAL_ROLE = "SPECIAL_ROLE"; //指定角色 + public const string SPECIAL_USER = "SPECIAL_USER"; //指定用户 + /// + /// 连续多级直属上级 + /// 不同于钉钉的各上级部门负责人审批,OpenAuth以用户的各级直属上级审批模式 + /// + public const string RUNTIME_MANY_PARENTS = "RUNTIME_MANY_PARENTS"; + /// + /// 部门负责人 + /// + public const string RUNTIME_CHAIRMAN = "RUNTIME_CHAIRMAN"; + /// + /// 上一节点执行人的直属上级 + /// + public const string RUNTIME_PARENT = "RUNTIME_PARENT"; + + public const string RUNTIME_SPECIAL_ROLE = "RUNTIME_SPECIAL_ROLE"; //运行时指定角色 + public const string RUNTIME_SPECIAL_USER = "RUNTIME_SPECIAL_USER"; //运行时指定用户 + + /// + /// 节点执行权限类型 + /// + public string NodeDesignate { get; set; } + + public Nodedesignatedata NodeDesignateData { get; set; } + public string NodeCode { get; set; } + public string NodeName { get; set; } + + /// + /// 流程执行时,三方回调的URL地址 + /// + public string ThirdPartyUrl { get; set; } + + /// + /// 驳回节点0"前一步"1"第一步"2"某一步" 3"不处理" + /// + public string NodeRejectType { get; set; } + + public int? Taged { get; set; } + public string UserName { get; set; } + public string UserId { get; set; } + public string Description { get; set; } + public string TagedTime { get; set; } + + //节点会签方式, + //all/空:默认为全部通过 + //one :至少有一个通过 + public string NodeConfluenceType { get; set; } + + /// + /// 会签通过的个数 + /// + public int? ConfluenceOk { get; set; } + + /// + /// 会签拒绝的个数 + /// + public int? ConfluenceNo { get; set; } + + /// + /// 可写的表单项ID + /// + public string[] CanWriteFormItemIds { get; set; } + } + + /// + /// 节点执行人 + /// + public class Nodedesignatedata + { + public string[] users { get; set; } + public string[] roles { get; set; } + public string[] orgs { get; set; } + } + + /// + /// 节点执行结果标签 + /// + public class Tag + { + /// + /// 1: 通过 + /// 2:不通过 + /// 3:驳回 + /// + public int Taged { get; set; } + + public string UserId { get; set; } + public string UserName { get; set; } + public string Description { get; set; } + public string TagedTime { get; set; } + } + + /// + /// 1: 通过 + /// 2:不通过 + /// 3:驳回 + /// + public enum TagState + { + Ok = 1, + No, + Reject + } } \ No newline at end of file diff --git a/OpenAuth.App/FlowInstance/FlowInstanceApp.cs b/OpenAuth.App/FlowInstance/FlowInstanceApp.cs index 1c405166..1e76b3f9 100644 --- a/OpenAuth.App/FlowInstance/FlowInstanceApp.cs +++ b/OpenAuth.App/FlowInstance/FlowInstanceApp.cs @@ -351,11 +351,10 @@ namespace OpenAuth.App { throw (new Exception("审核异常,找不到审核节点")); } - - flowInstanceOperationHistory.Content = "【" + wfruntime.Nodes[canCheckId].name - + "】【" + DateTime.Now.ToString("yyyy-MM-dd HH:mm") - + "】" + (tag.Taged == 1 ? "同意" : "不同意") + ",备注:" - + tag.Description; + + flowInstanceOperationHistory.Content = + $"{user.Account}-{DateTime.Now.ToString("yyyy-MM-dd HH:mm")}审批了【{wfruntime.Nodes[canCheckId].name}】" + + $"结果:{(tag.Taged == 1 ? "同意" : "不同意")},备注:{tag.Description}"; wfruntime.MakeTagNode(canCheckId, tag); //标记审核节点状态 string res = wfruntime.NodeConfluence(canCheckId, tag); @@ -386,7 +385,7 @@ namespace OpenAuth.App } #endregion 会签 - + #region 一般审核 else @@ -394,14 +393,30 @@ namespace OpenAuth.App wfruntime.MakeTagNode(wfruntime.currentNodeId, tag); if (tag.Taged == (int) TagState.Ok) { - flowInstance.PreviousId = flowInstance.ActivityId; - flowInstance.ActivityId = wfruntime.nextNodeId; - flowInstance.ActivityType = wfruntime.nextNodeType; - flowInstance.ActivityName = wfruntime.nextNode.name; - flowInstance.MakerList = wfruntime.nextNodeType == 4 ? "" : GetNextMakers(wfruntime, request); - flowInstance.IsFinish = (wfruntime.nextNodeType == 4 - ? FlowInstanceStatus.Finished - : FlowInstanceStatus.Running); + bool canNext = true; + if (wfruntime.currentNode.setInfo.NodeDesignate == Setinfo.RUNTIME_MANY_PARENTS) + { + var roles = _auth.GetCurrentUser().Roles; + //如果是连续多级直属上级且还没到指定的角色,只改变执行人,不到下一个节点 + if (!wfruntime.currentNode.setInfo.NodeDesignateData.roles.Intersect(roles.Select(u =>u.Id)).Any()) + { + canNext = false; + var parentId = _userManagerApp.GetParent(user.Id); + flowInstance.MakerList = parentId; + } + } + + if (canNext) + { + flowInstance.PreviousId = flowInstance.ActivityId; + flowInstance.ActivityId = wfruntime.nextNodeId; + flowInstance.ActivityType = wfruntime.nextNodeType; + flowInstance.ActivityName = wfruntime.nextNode.name; + flowInstance.MakerList = wfruntime.nextNodeType == 4 ? "" : GetNextMakers(wfruntime, request); + flowInstance.IsFinish = (wfruntime.nextNodeType == 4 + ? FlowInstanceStatus.Finished + : FlowInstanceStatus.Running); + } } else { @@ -412,10 +427,9 @@ namespace OpenAuth.App AddTransHistory(wfruntime); - flowInstanceOperationHistory.Content = "【" + wfruntime.currentNode.name - + "】【" + DateTime.Now.ToString("yyyy-MM-dd HH:mm") - + "】" + (tag.Taged == 1 ? "同意" : "不同意") + ",备注:" - + tag.Description; + flowInstanceOperationHistory.Content = + $"{user.Account}-{DateTime.Now.ToString("yyyy-MM-dd HH:mm")}审批了【{wfruntime.currentNode.name}】" + + $"结果:{(tag.Taged == 1 ? "同意" : "不同意")},备注:{tag.Description}"; } #endregion 一般审核 @@ -579,27 +593,20 @@ namespace OpenAuth.App makerList = GenericHelpers.ArrayToString(request.NodeDesignates, makerList); } - else if (wfruntime.nextNode.setInfo.NodeDesignate == Setinfo.RUNTIME_PARENT) + else if (wfruntime.nextNode.setInfo.NodeDesignate == Setinfo.RUNTIME_PARENT + || wfruntime.nextNode.setInfo.NodeDesignate == Setinfo.RUNTIME_MANY_PARENTS) { - //如果是发起人直属上级 + //如果是上一节点执行人的直属上级或连续多级直属上级 if (wfruntime.nextNode.setInfo.NodeDesignate != request.NodeDesignateType) { throw new Exception("前端提交的节点权限类型异常,请检查流程"); } - string createUserId = string.Empty; - if (wfruntime.currentNode.type == FlowNode.START) //如果是创建流程 - { - var user = _auth.GetCurrentUser().User; - createUserId = user.Id; - } - else //如果是审批 - { - FlowInstance flowInstance = Get(wfruntime.flowInstanceId); - createUserId = flowInstance.CreateUserId; - } + //当创建流程时,肯定执行的开始节点,登录用户就是创建用户 + //当审批流程时,能进到这里,表明当前登录用户已经有审批当前节点的权限,完全可以直接用登录用户的直接上级 + var user = _auth.GetCurrentUser().User; + var parentId = _userManagerApp.GetParent(user.Id); - var parentId = _userManagerApp.GetParent(createUserId); makerList = GenericHelpers.ArrayToString(new[]{parentId}, makerList); } else if (wfruntime.nextNode.setInfo.NodeDesignate == Setinfo.RUNTIME_CHAIRMAN)