diff --git a/OpenAuth.App/Flow/FlowRuntime.cs b/OpenAuth.App/Flow/FlowRuntime.cs
index 79ea9db1..4113da80 100644
--- a/OpenAuth.App/Flow/FlowRuntime.cs
+++ b/OpenAuth.App/Flow/FlowRuntime.cs
@@ -40,7 +40,7 @@ namespace OpenAuth.App.Flow
flowInstanceId = instance.Id;
//网关开始节点和流程结束节点没有下一步
- if (GetCurrentNodeType() == Define.NODE_TYPE_FORK
+ if (GetCurrentNodeType() == Define.NODE_TYPE_FORK
|| GetCurrentNodeType() == Define.NODE_TYPE_END)
{
nextNodeId = "-1";
@@ -118,9 +118,9 @@ namespace OpenAuth.App.Flow
{
throw new Exception("无法寻找到下一个节点");
}
-
+
//URL表单暂时不支持URL表单
- if(flowInstance.FrmType == Define.FORM_TYPE_URL) return lines[0].to;
+ if (flowInstance.FrmType == Define.FORM_TYPE_URL) return lines[0].to;
if (FrmData == "" || FrmData == "{}") return lines[0].to;
@@ -141,11 +141,11 @@ namespace OpenAuth.App.Flow
#endregion 私有方法
#region 共有方法
-
+
///
/// 判断流程是否完成
///
- public bool IsFinish()
+ public bool IsFinish()
{
return GetNextNodeType() == Define.NODE_TYPE_END;
}
@@ -379,7 +379,7 @@ namespace OpenAuth.App.Flow
}
flowInstance.SchemeContent = JsonHelper.Instance.Serialize(ToSchemeObj());
-
+
var sugarClient = AutofacContainerModule.GetService();
sugarClient.Updateable(flowInstance).ExecuteCommand();
@@ -398,7 +398,7 @@ namespace OpenAuth.App.Flow
{
item.Value.setInfo = null;
}
-
+
flowInstance.IsFinish = FlowInstanceStatus.Draft;
flowInstance.PreviousId = flowInstance.ActivityId;
flowInstance.ActivityId = startNodeId;
@@ -409,9 +409,9 @@ namespace OpenAuth.App.Flow
var sugarClient = AutofacContainerModule.GetService();
sugarClient.Updateable(flowInstance).ExecuteCommand();
-
+
SaveOperationHis($"【撤回】备注:{request.Description}");
-
+
sugarClient.Ado.CommitTran();
}
@@ -553,14 +553,14 @@ namespace OpenAuth.App.Flow
///
public void UndoVerification()
{
- // 已结束的流程不能撤销
- if (flowInstance.IsFinish == FlowInstanceStatus.Finished
+ // 已结束的流程不能撤销
+ if (flowInstance.IsFinish == FlowInstanceStatus.Finished
|| flowInstance.IsFinish == FlowInstanceStatus.Rejected)
{
throw new Exception("流程已结束,不能撤销");
}
- if(Nodes[previousId].type == Define.NODE_TYPE_START)
+ if (Nodes[previousId].type == Define.NODE_TYPE_START)
{
throw new Exception("没有任何审批,不能撤销!你可以删除或召回这个流程");
}
@@ -572,7 +572,7 @@ namespace OpenAuth.App.Flow
//向前查找ActivityId的前一个结点,即连线指向ActivityId的节点
flowInstance.PreviousId = GetPreNode().id;
flowInstance.MakerList = GetNodeMarkers(Nodes[currentNodeId]);
-
+
// 清除当前节点的审批状态
currentNode.setInfo.Taged = null;
currentNode.setInfo.UserId = "";
@@ -710,56 +710,66 @@ namespace OpenAuth.App.Flow
///
private string GetMultiInstanceNodeMakers(string nodeId)
{
- if(GetNodeType(nodeId) != Define.NODE_TYPE_MULTI_INSTANCE)
+ if (GetNodeType(nodeId) != Define.NODE_TYPE_MULTI_INSTANCE)
{
- throw new Exception("当前节点不是会签节点,请联系管理员");
+ throw new Exception("当前节点不是会签节点,请联系管理员");
}
var node = Nodes[nodeId];
string[] makerList = Array.Empty(); // 执行人列表
var sugarClient = AutofacContainerModule.GetService();
- if (node.setInfo.NodeDesignate == Define.SPECIAL_USER) //指定成员
- {
- makerList = node.setInfo.NodeDesignateData.datas;
- }
- else if (node.setInfo.NodeDesignate == Define.SPECIAL_ROLE) //指定角色
- {
- var revelanceApp = AutofacContainerModule.GetService();
- makerList = revelanceApp.Get(Define.USERROLE, false, node.setInfo.NodeDesignateData.datas).ToArray();
- }
- else if (node.setInfo.NodeDesignate == Define.SPECIAL_SQL) //指定SQL
- {
- //如果是指定SQL,则需要执行SQL,并返回结果
- var sql = ReplaceSql(node.setInfo.NodeDesignateData.datas[0]);
-
- makerList = sugarClient.Ado.SqlQuery(sql).ToArray();
- }
- else
- {
- throw new Exception("会签节点,不支持该类型,请重新设计流程模板");
- }
+ if (node.setInfo.NodeDesignate == Define.SPECIAL_USER) //指定用户
+ {
+ makerList = node.setInfo.NodeDesignateData.datas;
+ }
+ else if (node.setInfo.NodeDesignate == Define.SPECIAL_ROLE) //指定角色
+ {
+ var revelanceApp = AutofacContainerModule.GetService();
+ makerList = revelanceApp.Get(Define.USERROLE, false, node.setInfo.NodeDesignateData.datas).ToArray();
+ }
+ else if (node.setInfo.NodeDesignate == Define.SPECIAL_SQL) //指定SQL
+ {
+ //如果是指定SQL,则需要执行SQL,并返回结果
+ var sql = ReplaceSql(node.setInfo.NodeDesignateData.datas[0]);
- //写入到FlowApprover
- var users = sugarClient.Queryable().Where(u => makerList.Contains(u.Id)).ToList();
- int order = 1;
- foreach (var user in users)
+ makerList = sugarClient.Ado.SqlQuery(sql).ToArray();
+ }
+ else
+ {
+ throw new Exception("会签节点,不支持该类型,请重新设计流程模板");
+ }
+
+ //将所有的会签人员写入到FlowApprover,后续审批的时候,按加签的逻辑处理
+ var users = sugarClient.Queryable()
+ .Where(u => makerList.Contains(u.Id))
+ .ToList()
+ .OrderBy(u => Array.IndexOf(makerList, u.Id))
+ .ToList();
+ int order = 1;
+ foreach (var user in users)
+ {
+ var flowApprover = new FlowApprover
{
- var flowApprover = new FlowApprover
- {
- InstanceId = flowInstanceId,
- ActivityId = nodeId,
- ApproverId = user.Id,
- ApproverName = user.Name,
- OrderNo = order++,
- ApproveType = node.setInfo.NodeConfluenceType,
- ReturnToSignNode = false,
- Reason = "",
- CreateDate = DateTime.Now
- };
- sugarClient.Insertable(flowApprover).ExecuteCommand();
- }
- return GenericHelpers.ArrayToString(makerList, "");
+ InstanceId = flowInstanceId,
+ ActivityId = nodeId,
+ ApproverId = user.Id,
+ ApproverName = user.Name,
+ OrderNo = order++,
+ ApproveType = node.setInfo.NodeConfluenceType,
+ ReturnToSignNode = false,
+ Reason = "",
+ CreateDate = DateTime.Now
+ };
+ sugarClient.Insertable(flowApprover).ExecuteCommand();
+ }
+ //如果是顺序执行,取第一个人
+ if (node.setInfo.NodeConfluenceType == Define.APPROVE_TYPE_SEQUENTIAL)
+ {
+ return makerList[0];
+ }
+ //否则并行且/并行或都是返回所有加签人
+ return GenericHelpers.ArrayToString(makerList, "");
}
///
@@ -822,7 +832,8 @@ namespace OpenAuth.App.Flow
///
///
///
- private string ReplaceSql(string sql){
+ private string ReplaceSql(string sql)
+ {
var loginUser = AutofacContainerModule.GetService().GetCurrentUser();
var res = sql.Replace(Define.DATAPRIVILEGE_LOGINUSER, $"'{loginUser.User.Id}'");
res = res.Replace(Define.DATAPRIVILEGE_LOGINROLE, string.Join(',', loginUser.Roles.Select(u => $"'{u.Id}'")));
@@ -942,7 +953,7 @@ namespace OpenAuth.App.Flow
/// 上一个节点
///
private string previousId { get; set; }
-
+
///
/// 实例节点集合
///
@@ -962,7 +973,7 @@ namespace OpenAuth.App.Flow
/// 到达节点的线段集合
///
private Dictionary> ToNodeLines { get; set; }
-
+
///
/// 表单数据
///
diff --git a/OpenAuth.App/FlowInstance/FlowInstanceApp.cs b/OpenAuth.App/FlowInstance/FlowInstanceApp.cs
index 68f1f015..0dcc5300 100644
--- a/OpenAuth.App/FlowInstance/FlowInstanceApp.cs
+++ b/OpenAuth.App/FlowInstance/FlowInstanceApp.cs
@@ -2,7 +2,7 @@
* @Author: yubaolee | ahfu~ <954478625@qq.com>
* @Date: 2024-12-13 16:55:17
* @Description: 工作流实例表操作
- * @LastEditTime: 2025-04-17 21:37:03
+ * @LastEditTime: 2025-04-18 17:30:07
* Copyright (c) 2024 by yubaolee | ahfu~ , All Rights Reserved.
*/
@@ -460,6 +460,11 @@ namespace OpenAuth.App
if (!isfinish) //如果没有完成,不能到下一步
{
canNext = false;
+ flowInstance.MakerList = GenericHelpers.ArrayToString(_flowApproverApp.GetApproverIds(new QueryApproverReq()
+ {
+ FlowInstanceId = flowInstance.Id,
+ ActivityId = flowInstance.ActivityId
+ }), "");
}
else if (approverInfo.ReturnToSignNode == null || !approverInfo.ReturnToSignNode.Value)
{