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