From 0810b0b9c074c04f0fe546ec85ee92fa04b68f5b Mon Sep 17 00:00:00 2001 From: yubaolee Date: Mon, 26 Apr 2021 12:25:37 +0800 Subject: [PATCH] =?UTF-8?q?fix=20issue=20#I3NU1A=20=E5=A2=9E=E5=8A=A0?= =?UTF-8?q?=E6=B5=81=E7=A8=8B=E8=BF=90=E8=A1=8C=E6=97=B6=E5=8F=AF=E4=BB=A5?= =?UTF-8?q?=E9=80=89=E6=8B=A9=E6=89=A7=E8=A1=8C=E4=BA=BA=E6=88=96=E8=A7=92?= =?UTF-8?q?=E8=89=B2=E3=80=82=E5=8C=85=E6=8B=AC=E6=B5=81=E7=A8=8B=E5=AE=A1?= =?UTF-8?q?=E6=89=B9=E3=80=81=E6=B5=81=E7=A8=8B=E8=8A=82=E7=82=B9=E5=88=9B?= =?UTF-8?q?=E5=BB=BA=E6=97=B6=EF=BC=8C=E5=BC=80=E5=A7=8B=E8=8A=82=E7=82=B9?= =?UTF-8?q?=E7=9A=84=E4=B8=8B=E4=B8=80=E4=B8=AA=E8=8A=82=E7=82=B9=E5=A4=84?= =?UTF-8?q?=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- OpenAuth.App/Flow/FlowNode.cs | 19 ++-- OpenAuth.App/FlowInstance/FlowInstanceApp.cs | 87 +++++++++++++++---- .../Request/AddFlowInstanceReq.cs | 2 +- .../FlowInstance/Request/NodeDesignateReq.cs | 20 +++++ .../FlowInstance/Request/VerificationReq.cs | 7 +- .../Response/FlowVerificationResp.cs | 5 ++ .../Controllers/FlowInstancesController.cs | 3 +- 7 files changed, 116 insertions(+), 27 deletions(-) create mode 100644 OpenAuth.App/FlowInstance/Request/NodeDesignateReq.cs diff --git a/OpenAuth.App/Flow/FlowNode.cs b/OpenAuth.App/Flow/FlowNode.cs index 703b871e..7bd96a63 100644 --- a/OpenAuth.App/Flow/FlowNode.cs +++ b/OpenAuth.App/Flow/FlowNode.cs @@ -8,8 +8,8 @@ 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 const string FORK = "fork"; //会签开始节点 + public const string JOIN = "join"; //会签结束节点 public string id { get; set; } @@ -33,9 +33,12 @@ public class Setinfo { - public const string SPECIAL_USER = "SPECIAL_USER"; //指定用户 - public const string ALL_USER = "ALL_USER"; //所有用户 - public const string SPECIAL_ROLE = "SPECIAL_ROLE"; //指定角色 + public const string ALL_USER = "ALL_USER"; //所有用户 + public const string SPECIAL_ROLE = "SPECIAL_ROLE"; //指定角色 + public const string SPECIAL_USER = "SPECIAL_USER"; //指定用户 + + public const string RUNTIME_SPECIAL_ROLE = "RUNTIME_SPECIAL_ROLE"; //运行时指定角色 + public const string RUNTIME_SPECIAL_USER = "RUNTIME_SPECIAL_USER"; //运行时指定用户 /// /// 节点执行权限类型 @@ -45,10 +48,11 @@ public Nodedesignatedata NodeDesignateData { get; set; } public string NodeCode { get; set; } public string NodeName { get; set; } + /// /// 流程执行时,三方回调的URL地址 /// - public string ThirdPartyUrl { get; set; } + public string ThirdPartyUrl { get; set; } /// /// 驳回节点0"前一步"1"第一步"2"某一步" 3"不处理" @@ -98,6 +102,7 @@ /// 3:驳回 /// public int Taged { get; set; } + public string UserId { get; set; } public string UserName { get; set; } public string Description { get; set; } @@ -112,7 +117,7 @@ public enum TagState { Ok = 1, - No , + No, Reject } } \ No newline at end of file diff --git a/OpenAuth.App/FlowInstance/FlowInstanceApp.cs b/OpenAuth.App/FlowInstance/FlowInstanceApp.cs index ffc75d9e..4fd4dfb8 100644 --- a/OpenAuth.App/FlowInstance/FlowInstanceApp.cs +++ b/OpenAuth.App/FlowInstance/FlowInstanceApp.cs @@ -63,6 +63,7 @@ namespace OpenAuth.App /// public bool CreateInstance(AddFlowInstanceReq addFlowInstanceReq) { + CheckNodeDesignate(addFlowInstanceReq); FlowScheme scheme = null; if (!string.IsNullOrEmpty(addFlowInstanceReq.SchemeId)) { @@ -106,7 +107,7 @@ namespace OpenAuth.App flowInstance.PreviousId = wfruntime.currentNodeId; flowInstance.CreateUserId = user.User.Id; flowInstance.CreateUserName = user.User.Account; - flowInstance.MakerList = (wfruntime.GetNextNodeType() != 4 ? GetNextMakers(wfruntime) : ""); + flowInstance.MakerList = (wfruntime.GetNextNodeType() != 4 ? GetNextMakers(wfruntime, addFlowInstanceReq) : ""); flowInstance.IsFinish = (wfruntime.GetNextNodeType() == 4 ? FlowInstanceStatus.Finished : FlowInstanceStatus.Running); @@ -151,11 +152,21 @@ namespace OpenAuth.App /// /// /// - public bool NodeVerification(string instanceId, Tag tag) + public bool NodeVerification(VerificationReq request) { + var user = _auth.GetCurrentUser().User; + var instanceId = request.FlowInstanceId; + + var tag = new Tag + { + UserName = user.Name, + UserId = user.Id, + Description = request.VerificationOpinion, + Taged = Int32.Parse(request.VerificationFinally) + }; + FlowInstance flowInstance = Get(instanceId); - var user = _auth.GetCurrentUser().User; if (flowInstance.MakerList != "1" && !flowInstance.MakerList.Contains(user.Id)) { throw new Exception("当前用户没有审批该节点权限"); @@ -238,7 +249,7 @@ namespace OpenAuth.App flowInstance.ActivityId = wfruntime.nextNodeId; flowInstance.ActivityType = wfruntime.nextNodeType; flowInstance.ActivityName = wfruntime.nextNode.name; - flowInstance.MakerList = wfruntime.nextNodeType == 4 ? "" : GetNextMakers(wfruntime); + flowInstance.MakerList = wfruntime.nextNodeType == 4 ? "" : GetNextMakers(wfruntime, request); flowInstance.IsFinish = (wfruntime.nextNodeType == 4 ? FlowInstanceStatus.Finished : FlowInstanceStatus.Running); @@ -361,7 +372,7 @@ namespace OpenAuth.App /// 一般用于本节点审核完成后,修改流程实例的当前执行人,可以做到通知等功能 /// /// - private string GetNextMakers(FlowRuntime wfruntime) + private string GetNextMakers(FlowRuntime wfruntime, NodeDesignateReq request=null) { string makerList = ""; if (wfruntime.nextNodeId == "-1") @@ -373,6 +384,23 @@ namespace OpenAuth.App { makerList = GetForkNodeMakers(wfruntime, wfruntime.nextNodeId); } + else if (wfruntime.nextNode.setInfo.NodeDesignate == Setinfo.RUNTIME_SPECIAL_ROLE) + { //如果是运行时指定角色 + if (wfruntime.nextNode.setInfo.NodeDesignate != request.NodeDesignateType) + { + throw new Exception("前端提交的节点权限类型异常,请检查流程"); + } + var users = _revelanceApp.Get(Define.USERROLE, false, request.NodeDesignates); + makerList = GenericHelpers.ArrayToString(users, makerList); + } + else if (wfruntime.nextNode.setInfo.NodeDesignate == Setinfo.RUNTIME_SPECIAL_USER) + { //如果是运行时指定用户 + if (wfruntime.nextNode.setInfo.NodeDesignate != request.NodeDesignateType) + { + throw new Exception("前端提交的节点权限类型异常,请检查流程"); + } + makerList = GenericHelpers.ArrayToString(request.NodeDesignates, makerList); + } else { makerList = GetNodeMarkers(wfruntime.nextNode); @@ -475,6 +503,11 @@ namespace OpenAuth.App var users = _revelanceApp.Get(Define.USERROLE, false, node.setInfo.NodeDesignateData.roles); makerList = GenericHelpers.ArrayToString(users, makerList); } + else if (node.setInfo.NodeDesignate == Setinfo.RUNTIME_SPECIAL_ROLE + || node.setInfo.NodeDesignate == Setinfo.RUNTIME_SPECIAL_USER) + { + //如果是运行时选定的用户,则暂不处理。由上个节点审批时选定 + } } else //如果没有设置节点信息,默认所有人都可以审核 { @@ -492,22 +525,29 @@ namespace OpenAuth.App /// public void Verification(VerificationReq request) { - var user = _auth.GetCurrentUser().User; - var tag = new Tag - { - UserName = user.Name, - UserId = user.Id, - Description = request.VerificationOpinion, - Taged = Int32.Parse(request.VerificationFinally) - }; - bool isReject = TagState.Reject.Equals((TagState) tag.Taged); + CheckNodeDesignate(request); + bool isReject = TagState.Reject.Equals((TagState) Int32.Parse(request.VerificationFinally)); if (isReject) //驳回 { NodeReject(request); } else { - NodeVerification(request.FlowInstanceId, tag); + NodeVerification(request); + } + } + + /// + /// 判定节点需要选择执行人或执行角色 + /// + /// + /// + private void CheckNodeDesignate(NodeDesignateReq request) + { + if ((request.NodeDesignateType == Setinfo.RUNTIME_SPECIAL_ROLE + || request.NodeDesignateType == Setinfo.RUNTIME_SPECIAL_USER) && request.NodeDesignates.Length == 0) + { + throw new Exception("下个节点需要选择执行人或执行角色"); } } @@ -516,6 +556,23 @@ namespace OpenAuth.App Repository.Update(flowScheme); } + /// + /// 返回用于处理流程节点 + /// + /// + /// + public FlowVerificationResp GetForVerification(string id) + { + var flowinstance = Get(id); + var resp =flowinstance.MapTo(); + var runtime = new FlowRuntime(flowinstance); + if (runtime.nextNode != null && runtime.nextNode.setInfo !=null && runtime.nextNodeType != 4) + { + resp.NextNodeDesignateType = runtime.nextNode.setInfo.NodeDesignate; + } + return resp; + } + public async Task Load(QueryFlowInstanceListReq request) { var result = new TableData(); diff --git a/OpenAuth.App/FlowInstance/Request/AddFlowInstanceReq.cs b/OpenAuth.App/FlowInstance/Request/AddFlowInstanceReq.cs index 489ad2ba..1cf11ecc 100644 --- a/OpenAuth.App/FlowInstance/Request/AddFlowInstanceReq.cs +++ b/OpenAuth.App/FlowInstance/Request/AddFlowInstanceReq.cs @@ -15,7 +15,7 @@ namespace OpenAuth.App.Request /// /// 创建工作流请求 /// - public class AddFlowInstanceReq + public class AddFlowInstanceReq : NodeDesignateReq { /// diff --git a/OpenAuth.App/FlowInstance/Request/NodeDesignateReq.cs b/OpenAuth.App/FlowInstance/Request/NodeDesignateReq.cs new file mode 100644 index 00000000..a52ab16d --- /dev/null +++ b/OpenAuth.App/FlowInstance/Request/NodeDesignateReq.cs @@ -0,0 +1,20 @@ +using System.Collections.Generic; + +namespace OpenAuth.App.Request +{ + public class NodeDesignateReq + { + /// + /// 如果下个执行节点是运行时指定执行者。需要传指定的类型 + /// 取值为RUNTIME_SPECIAL_ROLE、RUNTIME_SPECIAL_USER + /// + public string NodeDesignateType { get; set; } + + /// + /// 如果下个执行节点是运行时指定执行者。该值表示具体的执行者 + /// 如果NodeDesignateType为RUNTIME_SPECIAL_ROLE,则该值为指定的角色 + /// 如果NodeDesignateType为RUNTIME_SPECIAL_USER,则该值为指定的用户 + /// + public string[] NodeDesignates { get; set; } + } +} diff --git a/OpenAuth.App/FlowInstance/Request/VerificationReq.cs b/OpenAuth.App/FlowInstance/Request/VerificationReq.cs index ae35949e..2aba6dc6 100644 --- a/OpenAuth.App/FlowInstance/Request/VerificationReq.cs +++ b/OpenAuth.App/FlowInstance/Request/VerificationReq.cs @@ -1,6 +1,8 @@ -namespace OpenAuth.App.Request +using System.Collections.Generic; + +namespace OpenAuth.App.Request { - public class VerificationReq + public class VerificationReq : NodeDesignateReq { public string FlowInstanceId { get; set; } /// @@ -22,5 +24,6 @@ /// 驳回类型。null:使用节点配置的驳回类型/0:前一步/1:第一步/2:指定节点,使用NodeRejectStep /// public string NodeRejectType { get; set; } + } } diff --git a/OpenAuth.App/FlowInstance/Response/FlowVerificationResp.cs b/OpenAuth.App/FlowInstance/Response/FlowVerificationResp.cs index 400a13ca..6304a941 100644 --- a/OpenAuth.App/FlowInstance/Response/FlowVerificationResp.cs +++ b/OpenAuth.App/FlowInstance/Response/FlowVerificationResp.cs @@ -12,5 +12,10 @@ namespace OpenAuth.App.Response { get { return FormUtil.Preview(this); } } + + /// + /// 下个节点的执行权限方式 + /// + public string NextNodeDesignateType { get; set; } } } diff --git a/OpenAuth.WebApi/Controllers/FlowInstancesController.cs b/OpenAuth.WebApi/Controllers/FlowInstancesController.cs index 5472e588..47cfbc61 100644 --- a/OpenAuth.WebApi/Controllers/FlowInstancesController.cs +++ b/OpenAuth.WebApi/Controllers/FlowInstancesController.cs @@ -32,8 +32,7 @@ namespace OpenAuth.WebApi.Controllers var result = new Response(); try { - var flowinstance = _app.Get(id); - result.Result = flowinstance.MapTo(); + result.Result = _app.GetForVerification(id); } catch (Exception ex) {