mirror of
https://gitee.com/dotnetchina/OpenAuth.Net.git
synced 2025-07-15 23:13:40 +08:00
重构流程实例代码
This commit is contained in:
parent
2eb6754015
commit
c7ac4e5e7a
@ -8,6 +8,10 @@ using System.Net.Http;
|
|||||||
using System.Text;
|
using System.Text;
|
||||||
using Castle.Core.Internal;
|
using Castle.Core.Internal;
|
||||||
using Infrastructure.Const;
|
using Infrastructure.Const;
|
||||||
|
using Infrastructure.Extensions.AutofacManager;
|
||||||
|
using Infrastructure.Helpers;
|
||||||
|
using OpenAuth.App.Interface;
|
||||||
|
using SqlSugar;
|
||||||
|
|
||||||
namespace OpenAuth.App.Flow
|
namespace OpenAuth.App.Flow
|
||||||
{
|
{
|
||||||
@ -295,7 +299,7 @@ namespace OpenAuth.App.Flow
|
|||||||
|
|
||||||
return Nodes[lines[0].from];
|
return Nodes[lines[0].from];
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 驳回
|
/// 驳回
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@ -371,13 +375,14 @@ namespace OpenAuth.App.Flow
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 生成一个扭转记录
|
/// 保存本次扭转记录
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="user">当前执行的用户</param>
|
|
||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
public FlowInstanceTransitionHistory GenTransitionHistory(User user)
|
public void SaveTransitionHis()
|
||||||
{
|
{
|
||||||
return new FlowInstanceTransitionHistory
|
var user = AutofacContainerModule.GetService<IAuth>().GetCurrentUser().User;
|
||||||
|
var SugarClient = AutofacContainerModule.GetService<ISqlSugarClient>();
|
||||||
|
var transitionHistory = new FlowInstanceTransitionHistory
|
||||||
{
|
{
|
||||||
InstanceId = flowInstanceId,
|
InstanceId = flowInstanceId,
|
||||||
CreateUserId = user.Id,
|
CreateUserId = user.Id,
|
||||||
@ -391,6 +396,8 @@ namespace OpenAuth.App.Flow
|
|||||||
IsFinish = nextNodeType == 4 ? FlowInstanceStatus.Finished : FlowInstanceStatus.Running,
|
IsFinish = nextNodeType == 4 ? FlowInstanceStatus.Finished : FlowInstanceStatus.Running,
|
||||||
TransitionSate = 0
|
TransitionSate = 0
|
||||||
};
|
};
|
||||||
|
|
||||||
|
SugarClient.Insertable(transitionHistory).ExecuteCommand();
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@ -425,6 +432,144 @@ namespace OpenAuth.App.Flow
|
|||||||
|
|
||||||
#endregion 共有方法
|
#endregion 共有方法
|
||||||
|
|
||||||
|
#region 获取节点审批人
|
||||||
|
/// <summary>
|
||||||
|
/// 计算节点执行人
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="node"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
public string GetNodeMarkers(FlowNode node, string flowinstanceCreateUserId = "")
|
||||||
|
{
|
||||||
|
string makerList = "";
|
||||||
|
if (node.type == FlowNode.START && (!string.IsNullOrEmpty(flowinstanceCreateUserId))) //如果是开始节点,通常情况下是驳回到开始了
|
||||||
|
{
|
||||||
|
makerList = flowinstanceCreateUserId;
|
||||||
|
}
|
||||||
|
else if (node.setInfo != null)
|
||||||
|
{
|
||||||
|
if (string.IsNullOrEmpty(node.setInfo.NodeDesignate) ||
|
||||||
|
node.setInfo.NodeDesignate == Setinfo.ALL_USER) //所有成员
|
||||||
|
{
|
||||||
|
makerList = "1";
|
||||||
|
}
|
||||||
|
else if (node.setInfo.NodeDesignate == Setinfo.SPECIAL_USER) //指定成员
|
||||||
|
{
|
||||||
|
makerList = GenericHelpers.ArrayToString(node.setInfo.NodeDesignateData.users, makerList);
|
||||||
|
}
|
||||||
|
else if (node.setInfo.NodeDesignate == Setinfo.SPECIAL_ROLE) //指定角色
|
||||||
|
{
|
||||||
|
var revelanceApp = AutofacContainerModule.GetService<RevelanceManagerApp>();
|
||||||
|
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 //如果没有设置节点信息,默认所有人都可以审核
|
||||||
|
{
|
||||||
|
makerList = "1";
|
||||||
|
}
|
||||||
|
|
||||||
|
return makerList;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 会签时,获取一条会签分支上面是否有用户可审核的节点
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="fromForkStartNode"></param>
|
||||||
|
/// <param name="tag"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
public string GetOneForkLineCanCheckNodeId(FlowNode fromForkStartNode, Tag tag)
|
||||||
|
{
|
||||||
|
string canCheckId = "";
|
||||||
|
var node = fromForkStartNode;
|
||||||
|
do //沿一条分支线路执行,直到遇到会签结束节点
|
||||||
|
{
|
||||||
|
var makerList = GetNodeMarkers(node);
|
||||||
|
|
||||||
|
if (node.setInfo.Taged == null && !string.IsNullOrEmpty(makerList) &&
|
||||||
|
makerList.Split(',').Any(one => tag.UserId == one))
|
||||||
|
{
|
||||||
|
canCheckId = node.id;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
node = GetNextNode(node.id);
|
||||||
|
} while (node.type != FlowNode.JOIN);
|
||||||
|
|
||||||
|
return canCheckId;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 获取会签开始节点的所有可执行者
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="forkNodeId">会签开始节点</param>
|
||||||
|
/// <returns></returns>
|
||||||
|
public string GetForkNodeMakers(string forkNodeId)
|
||||||
|
{
|
||||||
|
string makerList = "";
|
||||||
|
foreach (string fromForkStartNodeId in FromNodeLines[forkNodeId].Select(u => u.to))
|
||||||
|
{
|
||||||
|
var fromForkStartNode = Nodes[fromForkStartNodeId]; //与会签开始节点直接连接的节点
|
||||||
|
if (makerList != "")
|
||||||
|
{
|
||||||
|
makerList += ",";
|
||||||
|
}
|
||||||
|
|
||||||
|
makerList += GetOneForkLineMakers(fromForkStartNode);
|
||||||
|
}
|
||||||
|
|
||||||
|
return makerList;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 获取会签一条线上的审核者,该审核者应该是已审核过的节点的下一个人
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="fromForkStartNode">与会签开始节点直接连接的节点</param>
|
||||||
|
private string GetOneForkLineMakers(FlowNode fromForkStartNode)
|
||||||
|
{
|
||||||
|
string markers = "";
|
||||||
|
var node = fromForkStartNode;
|
||||||
|
do //沿一条分支线路执行,直到遇到第一个没有审核的节点
|
||||||
|
{
|
||||||
|
if (node.setInfo != null && node.setInfo.Taged != null)
|
||||||
|
{
|
||||||
|
if (node.type != FlowNode.FORK && node.setInfo.Taged != (int)TagState.Ok) //如果节点是不同意或驳回,则不用再找了
|
||||||
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
node = GetNextNode(node.id); //下一个节点
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
var marker = GetNodeMarkers(node);
|
||||||
|
if (marker == "")
|
||||||
|
{
|
||||||
|
throw new Exception($"节点{node.name}没有审核者,请检查!");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (marker == "1")
|
||||||
|
{
|
||||||
|
throw new Exception($"节点{node.name}是会签节点,不能用所有人,请检查!");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (markers != "")
|
||||||
|
{
|
||||||
|
markers += ",";
|
||||||
|
}
|
||||||
|
|
||||||
|
markers += marker;
|
||||||
|
break;
|
||||||
|
} while (node.type != FlowNode.JOIN);
|
||||||
|
|
||||||
|
return markers;
|
||||||
|
}
|
||||||
|
#endregion
|
||||||
|
|
||||||
#region 属性
|
#region 属性
|
||||||
|
|
||||||
private string title { get; set; }
|
private string title { get; set; }
|
||||||
|
@ -211,7 +211,7 @@ namespace OpenAuth.App
|
|||||||
|
|
||||||
#endregion 流程操作记录
|
#endregion 流程操作记录
|
||||||
|
|
||||||
AddTransHistory(wfruntime);
|
wfruntime.SaveTransitionHis();
|
||||||
SugarClient.Ado.CommitTran();
|
SugarClient.Ado.CommitTran();
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@ -361,7 +361,7 @@ namespace OpenAuth.App
|
|||||||
.Select(u => u.to))
|
.Select(u => u.to))
|
||||||
{
|
{
|
||||||
var fromForkStartNode = wfruntime.Nodes[fromForkStartNodeId]; //与会前开始节点直接连接的节点
|
var fromForkStartNode = wfruntime.Nodes[fromForkStartNodeId]; //与会前开始节点直接连接的节点
|
||||||
canCheckId = GetOneForkLineCanCheckNodeId(fromForkStartNode, wfruntime, tag);
|
canCheckId = wfruntime.GetOneForkLineCanCheckNodeId(fromForkStartNode, tag);
|
||||||
if (!string.IsNullOrEmpty(canCheckId)) break;
|
if (!string.IsNullOrEmpty(canCheckId)) break;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -393,13 +393,13 @@ namespace OpenAuth.App
|
|||||||
flowInstance.MakerList =
|
flowInstance.MakerList =
|
||||||
wfruntime.nextNodeType == 4 ? "" : GetNextMakers(wfruntime);
|
wfruntime.nextNodeType == 4 ? "" : GetNextMakers(wfruntime);
|
||||||
|
|
||||||
AddTransHistory(wfruntime);
|
wfruntime.SaveTransitionHis();
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
//会签过程中,需要更新用户
|
//会签过程中,需要更新用户
|
||||||
flowInstance.MakerList = GetForkNodeMakers(wfruntime, wfruntime.currentNodeId);
|
flowInstance.MakerList = wfruntime.GetForkNodeMakers(wfruntime.currentNodeId);
|
||||||
AddTransHistory(wfruntime);
|
wfruntime.SaveTransitionHis();
|
||||||
}
|
}
|
||||||
|
|
||||||
flowInstance.SchemeContent = JsonHelper.Instance.Serialize(wfruntime.ToSchemeObj());
|
flowInstance.SchemeContent = JsonHelper.Instance.Serialize(wfruntime.ToSchemeObj());
|
||||||
@ -536,28 +536,6 @@ namespace OpenAuth.App
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//会签时,获取一条会签分支上面是否有用户可审核的节点
|
|
||||||
private string GetOneForkLineCanCheckNodeId(FlowNode fromForkStartNode, FlowRuntime wfruntime, Tag tag)
|
|
||||||
{
|
|
||||||
string canCheckId = "";
|
|
||||||
var node = fromForkStartNode;
|
|
||||||
do //沿一条分支线路执行,直到遇到会签结束节点
|
|
||||||
{
|
|
||||||
var makerList = GetNodeMarkers(node);
|
|
||||||
|
|
||||||
if (node.setInfo.Taged == null && !string.IsNullOrEmpty(makerList) &&
|
|
||||||
makerList.Split(',').Any(one => tag.UserId == one))
|
|
||||||
{
|
|
||||||
canCheckId = node.id;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
node = wfruntime.GetNextNode(node.id);
|
|
||||||
} while (node.type != FlowNode.JOIN);
|
|
||||||
|
|
||||||
return canCheckId;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 驳回
|
/// 驳回
|
||||||
/// 如果NodeRejectStep不为空,优先使用;否则按照NodeRejectType驳回
|
/// 如果NodeRejectStep不为空,优先使用;否则按照NodeRejectType驳回
|
||||||
@ -595,9 +573,9 @@ namespace OpenAuth.App
|
|||||||
flowInstance.ActivityId = rejectNode;
|
flowInstance.ActivityId = rejectNode;
|
||||||
flowInstance.ActivityType = wfruntime.GetNodeType(rejectNode);
|
flowInstance.ActivityType = wfruntime.GetNodeType(rejectNode);
|
||||||
flowInstance.ActivityName = wfruntime.Nodes[rejectNode].name;
|
flowInstance.ActivityName = wfruntime.Nodes[rejectNode].name;
|
||||||
flowInstance.MakerList = GetNodeMarkers(wfruntime.Nodes[rejectNode], flowInstance.CreateUserId);
|
flowInstance.MakerList = wfruntime.GetNodeMarkers(wfruntime.Nodes[rejectNode], flowInstance.CreateUserId);
|
||||||
|
|
||||||
AddTransHistory(wfruntime);
|
wfruntime.SaveTransitionHis();
|
||||||
}
|
}
|
||||||
|
|
||||||
flowInstance.SchemeContent = JsonHelper.Instance.Serialize(wfruntime.ToSchemeObj());
|
flowInstance.SchemeContent = JsonHelper.Instance.Serialize(wfruntime.ToSchemeObj());
|
||||||
@ -642,7 +620,7 @@ namespace OpenAuth.App
|
|||||||
|
|
||||||
if (wfruntime.nextNodeType == 0) //如果是会签节点
|
if (wfruntime.nextNodeType == 0) //如果是会签节点
|
||||||
{
|
{
|
||||||
makerList = GetForkNodeMakers(wfruntime, wfruntime.nextNodeId);
|
makerList = wfruntime.GetForkNodeMakers(wfruntime.nextNodeId);
|
||||||
}
|
}
|
||||||
else if (wfruntime.nextNode.setInfo.NodeDesignate == Setinfo.RUNTIME_SPECIAL_ROLE)
|
else if (wfruntime.nextNode.setInfo.NodeDesignate == Setinfo.RUNTIME_SPECIAL_ROLE)
|
||||||
{
|
{
|
||||||
@ -698,7 +676,7 @@ namespace OpenAuth.App
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
makerList = GetNodeMarkers(wfruntime.nextNode);
|
makerList = wfruntime.GetNodeMarkers(wfruntime.nextNode);
|
||||||
if (string.IsNullOrEmpty(makerList))
|
if (string.IsNullOrEmpty(makerList))
|
||||||
{
|
{
|
||||||
throw new Exception("无法寻找到节点的审核者,请查看流程设计是否有问题!");
|
throw new Exception("无法寻找到节点的审核者,请查看流程设计是否有问题!");
|
||||||
@ -708,110 +686,6 @@ namespace OpenAuth.App
|
|||||||
return makerList;
|
return makerList;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 获取会签开始节点的所有可执行者
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="forkNodeId">会签开始节点</param>
|
|
||||||
/// <returns></returns>
|
|
||||||
private string GetForkNodeMakers(FlowRuntime wfruntime, string forkNodeId)
|
|
||||||
{
|
|
||||||
string makerList = "";
|
|
||||||
foreach (string fromForkStartNodeId in wfruntime.FromNodeLines[forkNodeId].Select(u => u.to))
|
|
||||||
{
|
|
||||||
var fromForkStartNode = wfruntime.Nodes[fromForkStartNodeId]; //与会前开始节点直接连接的节点
|
|
||||||
if (makerList != "")
|
|
||||||
{
|
|
||||||
makerList += ",";
|
|
||||||
}
|
|
||||||
|
|
||||||
makerList += GetOneForkLineMakers(fromForkStartNode, wfruntime);
|
|
||||||
}
|
|
||||||
|
|
||||||
return makerList;
|
|
||||||
}
|
|
||||||
|
|
||||||
//获取会签一条线上的审核者,该审核者应该是已审核过的节点的下一个人
|
|
||||||
private string GetOneForkLineMakers(FlowNode fromForkStartNode, FlowRuntime wfruntime)
|
|
||||||
{
|
|
||||||
string markers = "";
|
|
||||||
var node = fromForkStartNode;
|
|
||||||
do //沿一条分支线路执行,直到遇到第一个没有审核的节点
|
|
||||||
{
|
|
||||||
if (node.setInfo != null && node.setInfo.Taged != null)
|
|
||||||
{
|
|
||||||
if (node.type != FlowNode.FORK && node.setInfo.Taged != (int)TagState.Ok) //如果节点是不同意或驳回,则不用再找了
|
|
||||||
{
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
node = wfruntime.GetNextNode(node.id); //下一个节点
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
var marker = GetNodeMarkers(node);
|
|
||||||
if (marker == "")
|
|
||||||
{
|
|
||||||
throw new Exception($"节点{node.name}没有审核者,请检查!");
|
|
||||||
}
|
|
||||||
|
|
||||||
if (marker == "1")
|
|
||||||
{
|
|
||||||
throw new Exception($"节点{node.name}是会签节点,不能用所有人,请检查!");
|
|
||||||
}
|
|
||||||
|
|
||||||
if (markers != "")
|
|
||||||
{
|
|
||||||
markers += ",";
|
|
||||||
}
|
|
||||||
|
|
||||||
markers += marker;
|
|
||||||
break;
|
|
||||||
} while (node.type != FlowNode.JOIN);
|
|
||||||
|
|
||||||
return markers;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 寻找该节点执行人
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="node"></param>
|
|
||||||
/// <returns></returns>
|
|
||||||
private string GetNodeMarkers(FlowNode node, string flowinstanceCreateUserId = "")
|
|
||||||
{
|
|
||||||
string makerList = "";
|
|
||||||
if (node.type == FlowNode.START && (!string.IsNullOrEmpty(flowinstanceCreateUserId))) //如果是开始节点,通常情况下是驳回到开始了
|
|
||||||
{
|
|
||||||
makerList = flowinstanceCreateUserId;
|
|
||||||
}
|
|
||||||
else if (node.setInfo != null)
|
|
||||||
{
|
|
||||||
if (string.IsNullOrEmpty(node.setInfo.NodeDesignate) ||
|
|
||||||
node.setInfo.NodeDesignate == Setinfo.ALL_USER) //所有成员
|
|
||||||
{
|
|
||||||
makerList = "1";
|
|
||||||
}
|
|
||||||
else if (node.setInfo.NodeDesignate == Setinfo.SPECIAL_USER) //指定成员
|
|
||||||
{
|
|
||||||
makerList = GenericHelpers.ArrayToString(node.setInfo.NodeDesignateData.users, makerList);
|
|
||||||
}
|
|
||||||
else if (node.setInfo.NodeDesignate == Setinfo.SPECIAL_ROLE) //指定角色
|
|
||||||
{
|
|
||||||
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 //如果没有设置节点信息,默认所有人都可以审核
|
|
||||||
{
|
|
||||||
makerList = "1";
|
|
||||||
}
|
|
||||||
|
|
||||||
return makerList;
|
|
||||||
}
|
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
@ -974,15 +848,6 @@ namespace OpenAuth.App
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 添加扭转记录
|
|
||||||
/// </summary>
|
|
||||||
private void AddTransHistory(FlowRuntime wfruntime)
|
|
||||||
{
|
|
||||||
var user = _auth.GetCurrentUser().User;
|
|
||||||
SugarClient.Insertable(wfruntime.GenTransitionHistory(user)).ExecuteCommand();
|
|
||||||
}
|
|
||||||
|
|
||||||
private void AddOperationHis(string instanceId, Tag tag, string content)
|
private void AddOperationHis(string instanceId, Tag tag, string content)
|
||||||
{
|
{
|
||||||
FlowInstanceOperationHistory flowInstanceOperationHistory = new FlowInstanceOperationHistory
|
FlowInstanceOperationHistory flowInstanceOperationHistory = new FlowInstanceOperationHistory
|
||||||
@ -1028,9 +893,9 @@ namespace OpenAuth.App
|
|||||||
flowInstance.ActivityId = startNodeId;
|
flowInstance.ActivityId = startNodeId;
|
||||||
flowInstance.ActivityType = wfruntime.GetNodeType(startNodeId);
|
flowInstance.ActivityType = wfruntime.GetNodeType(startNodeId);
|
||||||
flowInstance.ActivityName = wfruntime.Nodes[startNodeId].name;
|
flowInstance.ActivityName = wfruntime.Nodes[startNodeId].name;
|
||||||
flowInstance.MakerList = GetNodeMarkers(wfruntime.Nodes[startNodeId], flowInstance.CreateUserId);
|
flowInstance.MakerList = wfruntime.GetNodeMarkers(wfruntime.Nodes[startNodeId], flowInstance.CreateUserId);
|
||||||
|
|
||||||
AddTransHistory(wfruntime);
|
wfruntime.SaveTransitionHis();
|
||||||
|
|
||||||
SugarClient.Updateable(flowInstance).ExecuteCommand();
|
SugarClient.Updateable(flowInstance).ExecuteCommand();
|
||||||
|
|
||||||
@ -1096,7 +961,7 @@ namespace OpenAuth.App
|
|||||||
|
|
||||||
#endregion 流程操作记录
|
#endregion 流程操作记录
|
||||||
|
|
||||||
AddTransHistory(wfruntime);
|
wfruntime.SaveTransitionHis();
|
||||||
SugarClient.Ado.CommitTran();
|
SugarClient.Ado.CommitTran();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user