mirror of
https://gitee.com/dotnetchina/OpenAuth.Net.git
synced 2025-09-20 18:47:55 +08:00
fix issue #I3NU1A
增加流程运行时可以选择执行人或角色。包括流程审批、流程节点创建时,开始节点的下一个节点处理
This commit is contained in:
@@ -33,9 +33,12 @@
|
|||||||
|
|
||||||
public class Setinfo
|
public class Setinfo
|
||||||
{
|
{
|
||||||
public const string SPECIAL_USER = "SPECIAL_USER"; //指定用户
|
|
||||||
public const string ALL_USER = "ALL_USER"; //所有用户
|
public const string ALL_USER = "ALL_USER"; //所有用户
|
||||||
public const string SPECIAL_ROLE = "SPECIAL_ROLE"; //指定角色
|
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"; //运行时指定用户
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 节点执行权限类型
|
/// 节点执行权限类型
|
||||||
@@ -45,6 +48,7 @@
|
|||||||
public Nodedesignatedata NodeDesignateData { get; set; }
|
public Nodedesignatedata NodeDesignateData { get; set; }
|
||||||
public string NodeCode { get; set; }
|
public string NodeCode { get; set; }
|
||||||
public string NodeName { get; set; }
|
public string NodeName { get; set; }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 流程执行时,三方回调的URL地址
|
/// 流程执行时,三方回调的URL地址
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@@ -98,6 +102,7 @@
|
|||||||
/// 3:驳回
|
/// 3:驳回
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public int Taged { get; set; }
|
public int Taged { get; set; }
|
||||||
|
|
||||||
public string UserId { get; set; }
|
public string UserId { get; set; }
|
||||||
public string UserName { get; set; }
|
public string UserName { get; set; }
|
||||||
public string Description { get; set; }
|
public string Description { get; set; }
|
||||||
@@ -112,7 +117,7 @@
|
|||||||
public enum TagState
|
public enum TagState
|
||||||
{
|
{
|
||||||
Ok = 1,
|
Ok = 1,
|
||||||
No ,
|
No,
|
||||||
Reject
|
Reject
|
||||||
}
|
}
|
||||||
}
|
}
|
@@ -63,6 +63,7 @@ namespace OpenAuth.App
|
|||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
public bool CreateInstance(AddFlowInstanceReq addFlowInstanceReq)
|
public bool CreateInstance(AddFlowInstanceReq addFlowInstanceReq)
|
||||||
{
|
{
|
||||||
|
CheckNodeDesignate(addFlowInstanceReq);
|
||||||
FlowScheme scheme = null;
|
FlowScheme scheme = null;
|
||||||
if (!string.IsNullOrEmpty(addFlowInstanceReq.SchemeId))
|
if (!string.IsNullOrEmpty(addFlowInstanceReq.SchemeId))
|
||||||
{
|
{
|
||||||
@@ -106,7 +107,7 @@ namespace OpenAuth.App
|
|||||||
flowInstance.PreviousId = wfruntime.currentNodeId;
|
flowInstance.PreviousId = wfruntime.currentNodeId;
|
||||||
flowInstance.CreateUserId = user.User.Id;
|
flowInstance.CreateUserId = user.User.Id;
|
||||||
flowInstance.CreateUserName = user.User.Account;
|
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
|
flowInstance.IsFinish = (wfruntime.GetNextNodeType() == 4
|
||||||
? FlowInstanceStatus.Finished
|
? FlowInstanceStatus.Finished
|
||||||
: FlowInstanceStatus.Running);
|
: FlowInstanceStatus.Running);
|
||||||
@@ -151,11 +152,21 @@ namespace OpenAuth.App
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="instanceId"></param>
|
/// <param name="instanceId"></param>
|
||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
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);
|
FlowInstance flowInstance = Get(instanceId);
|
||||||
|
|
||||||
var user = _auth.GetCurrentUser().User;
|
|
||||||
if (flowInstance.MakerList != "1" && !flowInstance.MakerList.Contains(user.Id))
|
if (flowInstance.MakerList != "1" && !flowInstance.MakerList.Contains(user.Id))
|
||||||
{
|
{
|
||||||
throw new Exception("当前用户没有审批该节点权限");
|
throw new Exception("当前用户没有审批该节点权限");
|
||||||
@@ -238,7 +249,7 @@ namespace OpenAuth.App
|
|||||||
flowInstance.ActivityId = wfruntime.nextNodeId;
|
flowInstance.ActivityId = wfruntime.nextNodeId;
|
||||||
flowInstance.ActivityType = wfruntime.nextNodeType;
|
flowInstance.ActivityType = wfruntime.nextNodeType;
|
||||||
flowInstance.ActivityName = wfruntime.nextNode.name;
|
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
|
flowInstance.IsFinish = (wfruntime.nextNodeType == 4
|
||||||
? FlowInstanceStatus.Finished
|
? FlowInstanceStatus.Finished
|
||||||
: FlowInstanceStatus.Running);
|
: FlowInstanceStatus.Running);
|
||||||
@@ -361,7 +372,7 @@ namespace OpenAuth.App
|
|||||||
/// 一般用于本节点审核完成后,修改流程实例的当前执行人,可以做到通知等功能
|
/// 一般用于本节点审核完成后,修改流程实例的当前执行人,可以做到通知等功能
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
private string GetNextMakers(FlowRuntime wfruntime)
|
private string GetNextMakers(FlowRuntime wfruntime, NodeDesignateReq request=null)
|
||||||
{
|
{
|
||||||
string makerList = "";
|
string makerList = "";
|
||||||
if (wfruntime.nextNodeId == "-1")
|
if (wfruntime.nextNodeId == "-1")
|
||||||
@@ -373,6 +384,23 @@ namespace OpenAuth.App
|
|||||||
{
|
{
|
||||||
makerList = GetForkNodeMakers(wfruntime, wfruntime.nextNodeId);
|
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
|
else
|
||||||
{
|
{
|
||||||
makerList = GetNodeMarkers(wfruntime.nextNode);
|
makerList = GetNodeMarkers(wfruntime.nextNode);
|
||||||
@@ -475,6 +503,11 @@ namespace OpenAuth.App
|
|||||||
var users = _revelanceApp.Get(Define.USERROLE, false, node.setInfo.NodeDesignateData.roles);
|
var users = _revelanceApp.Get(Define.USERROLE, false, node.setInfo.NodeDesignateData.roles);
|
||||||
makerList = GenericHelpers.ArrayToString(users, makerList);
|
makerList = GenericHelpers.ArrayToString(users, makerList);
|
||||||
}
|
}
|
||||||
|
else if (node.setInfo.NodeDesignate == Setinfo.RUNTIME_SPECIAL_ROLE
|
||||||
|
|| node.setInfo.NodeDesignate == Setinfo.RUNTIME_SPECIAL_USER)
|
||||||
|
{
|
||||||
|
//如果是运行时选定的用户,则暂不处理。由上个节点审批时选定
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else //如果没有设置节点信息,默认所有人都可以审核
|
else //如果没有设置节点信息,默认所有人都可以审核
|
||||||
{
|
{
|
||||||
@@ -492,22 +525,29 @@ namespace OpenAuth.App
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public void Verification(VerificationReq request)
|
public void Verification(VerificationReq request)
|
||||||
{
|
{
|
||||||
var user = _auth.GetCurrentUser().User;
|
CheckNodeDesignate(request);
|
||||||
var tag = new Tag
|
bool isReject = TagState.Reject.Equals((TagState) Int32.Parse(request.VerificationFinally));
|
||||||
{
|
|
||||||
UserName = user.Name,
|
|
||||||
UserId = user.Id,
|
|
||||||
Description = request.VerificationOpinion,
|
|
||||||
Taged = Int32.Parse(request.VerificationFinally)
|
|
||||||
};
|
|
||||||
bool isReject = TagState.Reject.Equals((TagState) tag.Taged);
|
|
||||||
if (isReject) //驳回
|
if (isReject) //驳回
|
||||||
{
|
{
|
||||||
NodeReject(request);
|
NodeReject(request);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
NodeVerification(request.FlowInstanceId, tag);
|
NodeVerification(request);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 判定节点需要选择执行人或执行角色
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="request"></param>
|
||||||
|
/// <exception cref="Exception"></exception>
|
||||||
|
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);
|
Repository.Update(flowScheme);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 返回用于处理流程节点
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="id"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
public FlowVerificationResp GetForVerification(string id)
|
||||||
|
{
|
||||||
|
var flowinstance = Get(id);
|
||||||
|
var resp =flowinstance.MapTo<FlowVerificationResp>();
|
||||||
|
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<TableData> Load(QueryFlowInstanceListReq request)
|
public async Task<TableData> Load(QueryFlowInstanceListReq request)
|
||||||
{
|
{
|
||||||
var result = new TableData();
|
var result = new TableData();
|
||||||
|
@@ -15,7 +15,7 @@ namespace OpenAuth.App.Request
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// 创建工作流请求
|
/// 创建工作流请求
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public class AddFlowInstanceReq
|
public class AddFlowInstanceReq : NodeDesignateReq
|
||||||
{
|
{
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
20
OpenAuth.App/FlowInstance/Request/NodeDesignateReq.cs
Normal file
20
OpenAuth.App/FlowInstance/Request/NodeDesignateReq.cs
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
using System.Collections.Generic;
|
||||||
|
|
||||||
|
namespace OpenAuth.App.Request
|
||||||
|
{
|
||||||
|
public class NodeDesignateReq
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 如果下个执行节点是运行时指定执行者。需要传指定的类型
|
||||||
|
/// <para>取值为RUNTIME_SPECIAL_ROLE、RUNTIME_SPECIAL_USER</para>
|
||||||
|
/// </summary>
|
||||||
|
public string NodeDesignateType { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 如果下个执行节点是运行时指定执行者。该值表示具体的执行者
|
||||||
|
/// <para>如果NodeDesignateType为RUNTIME_SPECIAL_ROLE,则该值为指定的角色</para>
|
||||||
|
/// <para>如果NodeDesignateType为RUNTIME_SPECIAL_USER,则该值为指定的用户</para>
|
||||||
|
/// </summary>
|
||||||
|
public string[] NodeDesignates { get; set; }
|
||||||
|
}
|
||||||
|
}
|
@@ -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; }
|
public string FlowInstanceId { get; set; }
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@@ -22,5 +24,6 @@
|
|||||||
/// 驳回类型。null:使用节点配置的驳回类型/0:前一步/1:第一步/2:指定节点,使用NodeRejectStep
|
/// 驳回类型。null:使用节点配置的驳回类型/0:前一步/1:第一步/2:指定节点,使用NodeRejectStep
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public string NodeRejectType { get; set; }
|
public string NodeRejectType { get; set; }
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -12,5 +12,10 @@ namespace OpenAuth.App.Response
|
|||||||
{
|
{
|
||||||
get { return FormUtil.Preview(this); }
|
get { return FormUtil.Preview(this); }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 下个节点的执行权限方式
|
||||||
|
/// </summary>
|
||||||
|
public string NextNodeDesignateType { get; set; }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -32,8 +32,7 @@ namespace OpenAuth.WebApi.Controllers
|
|||||||
var result = new Response<FlowVerificationResp>();
|
var result = new Response<FlowVerificationResp>();
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
var flowinstance = _app.Get(id);
|
result.Result = _app.GetForVerification(id);
|
||||||
result.Result = flowinstance.MapTo<FlowVerificationResp>();
|
|
||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
{
|
{
|
||||||
|
Reference in New Issue
Block a user