using JNPF.Common.Enums;
using JNPF.Common.Extension;
using JNPF.Common.Security;
using JNPF.FriendlyException;
using JNPF.WorkFlow.Entitys.Entity;
using JNPF.WorkFlow.Entitys.Enum;
using JNPF.WorkFlow.Entitys.Model;
using JNPF.WorkFlow.Interfaces.Repository;
namespace JNPF.WorkFlow.Manager;
public class FlowTaskNodeUtil
{
private readonly IFlowTaskRepository _flowTaskRepository;
public FlowTaskNodeUtil(IFlowTaskRepository flowTaskRepository)
{
_flowTaskRepository = flowTaskRepository;
}
#region 节点处理
///
/// 判断分流节点是否完成
/// (因为分流节点最终只能是一个 所以只需判断下一节点中的其中一个的上节点完成情况).
///
/// 所有节点.
/// 下一个节点编码.
/// 当前节点.
///
public bool IsShuntNodeCompletion(List flowTaskNodeEntityList, string nextNodeCode, FlowTaskNodeEntity flowTaskNodeEntity)
{
var shuntNodeCodeList = flowTaskNodeEntityList.FindAll(x => x.NodeNext.IsNotEmptyOrNull() &&
x.NodeCode != flowTaskNodeEntity.NodeCode && x.NodeNext.Contains(nextNodeCode) && x.Completion == 0);
return shuntNodeCodeList.Count == 0;
}
///
/// 替换审批同意任务当前节点.
///
/// 所有节点.
/// 替换数据.
/// 源数据.
///
public string GetThisStepId(List flowTaskNodeEntityList, List nextNodeCodeList, string thisStepId)
{
var replaceNodeCodeList = new List();
nextNodeCodeList.ForEach(item =>
{
var nodeCode = new List();
var nodeEntityList = flowTaskNodeEntityList.FindAll(x => x.NodeNext.IsNotEmptyOrNull() && x.NodeNext.Contains(item));
nodeCode = nodeEntityList.Select(x => x.NodeCode).ToList();
replaceNodeCodeList = replaceNodeCodeList.Union(nodeCode).ToList();
});
var thisNodeList = new List();
if (thisStepId.IsNotEmptyOrNull())
{
thisNodeList = thisStepId.Split(",").ToList();
}
//去除当前审批节点并添加下个节点
var list = thisNodeList.Except(replaceNodeCodeList).Union(nextNodeCodeList);
return string.Join(",", list.ToArray());
}
///
/// 替换审批撤回当前任务节点.
///
/// 下一节点编码.
/// 当前待处理节点.
///
public string GetRecallThisStepId(List nextNodeCodeList, string thisStepId)
{
var replaceNodeCodeList = new List();
foreach (var item in nextNodeCodeList)
{
var nodeCode = item.NodeNext.Split(",").ToList();
replaceNodeCodeList = replaceNodeCodeList.Union(nodeCode).ToList();
}
var thisNodeList = new List();
if (thisStepId.IsNotEmptyOrNull())
{
thisNodeList = thisStepId.Split(",").ToList();
}
//去除当前审批节点并添加下个节点
var list = thisNodeList.Except(replaceNodeCodeList).Union(nextNodeCodeList.Select(x => x.NodeCode));
return string.Join(",", list.ToArray());
}
///
/// 驳回替换任务当前节点.
///
/// 驳回节点下所有节点.
/// 当前节点.
/// 当前待处理节点.
///
public string GetRejectThisStepId(List flowTaskNodeEntityList, List upNodeCodes, string thisStepId)
{
// 驳回节点下所有节点编码
var removeNodeCodeList = flowTaskNodeEntityList.Select(x => x.NodeCode).ToList();
var ids = thisStepId.Split(",").ToList();
var thisNodes = ids.Except(removeNodeCodeList).Union(upNodeCodes).ToList();
return string.Join(",", thisNodes);
}
///
/// 根据当前节点编码获取节点名称.
///
/// 所有节点.
/// 当前待处理节点.
///
public string GetThisStep(List flowTaskNodeEntityList, string thisStepId)
{
var ids = thisStepId.Split(",").ToList();
var nextNodeNameList = new List();
foreach (var item in ids)
{
var name = flowTaskNodeEntityList.Find(x => x.NodeCode.Equals(item)).NodeName;
nextNodeNameList.Add(name);
}
return string.Join(",", nextNodeNameList);
}
///
/// 获取驳回节点.
///
/// 任务参数.
///
public List GetRejectNode(FlowTaskParamter flowTaskParamter)
{
//驳回节点(除了上一节点,所有驳回节点都是单节点)
var upflowTaskNodeEntityList = new List();
if (flowTaskParamter.flowTaskNodeEntity.NodeUp == "1")
{
upflowTaskNodeEntityList = flowTaskParamter.flowTaskNodeEntityList.FindAll(x => x.NodeNext.IsNotEmptyOrNull() && x.NodeNext.Contains(flowTaskParamter.flowTaskNodeEntity.NodeCode));
}
else
{
var upflowTaskNodeEntity = flowTaskParamter.flowTaskNodeEntityList.Find(x => x.NodeCode == flowTaskParamter.rejectStep);
upflowTaskNodeEntityList.Add(upflowTaskNodeEntity);
}
return upflowTaskNodeEntityList;
}
///
/// 修改节点完成状态.
///
/// 修改节点.
/// 状态.
///
public async Task RejectUpdateTaskNode(List taskNodeList, int state)
{
foreach (var item in taskNodeList)
{
item.Completion = state;
await _flowTaskRepository.UpdateTaskNode(item);
}
}
///
/// 处理并保存节点.
///
/// 节点list.
public void UpdateNodeSort(List entitys)
{
var startNodes = entitys.FindAll(x => x.NodeType.Equals("start"));
if (startNodes.Count > 0)
{
var startNode = startNodes[0].NodeCode;
long num = 0L;
long maxNum = 0L;
var max = new List();
var _treeList = new List();
NodeList(entitys, startNode, _treeList, num, max);
max.Sort();
if (max.Count > 0)
{
maxNum = max[max.Count - 1];
}
var nodeNext = "end";
foreach (var item in entitys)
{
var type = item.NodeType;
var node = _treeList.Find(x => x.NodeCode.Equals(item.NodeCode));
if (item.NodeNext.IsEmpty())
{
item.NodeNext = nodeNext;
}
if (node.IsNotEmptyOrNull())
{
item.SortCode = node.SortCode;
item.State = "0";
if (item.NodeNext.IsEmpty())
{
item.NodeNext = nodeNext;
}
}
}
entitys.Add(new FlowTaskNodeEntity()
{
Id = SnowflakeIdHelper.NextId(),
NodeCode = nodeNext,
NodeName = "结束",
Completion = 0,
CreatorTime = DateTime.Now,
SortCode = maxNum + 1,
TaskId = _treeList[0].TaskId,
NodePropertyJson = startNodes[0].NodePropertyJson,
NodeType = "endround",
State = "0"
});
}
}
///
/// 递归获取经过的节点.
///
/// 所有节点.
/// 节点编码.
/// 节点集合(容器).
/// 递归次数.
/// 递归次数值.
public void NodeList(List dataAll, string nodeCode, List _treeList, long num, List max)
{
num++;
max.Add(num);
foreach (var item in dataAll)
{
if (item.NodeCode.Contains(nodeCode))
{
item.SortCode = num;
item.State = "0";
_treeList.Add(item);
foreach (var nodeNext in item.NodeNext.Split(","))
{
long nums = _treeList.FindAll(x => x.NodeCode.Equals(nodeNext)).Count;
if (nodeNext.IsNotEmptyOrNull() && nums == 0)
{
NodeList(dataAll, nodeNext, _treeList, num, max);
}
}
}
}
}
///
/// 递归节点下所有节点.
///
/// 所有节点.
/// 下一节点.
/// 指定节点下所有节点.
public async Task GetAllNextNode(List flowTaskNodeList, string nodeNext, List flowTaskNodeEntities)
{
var nextNodes = nodeNext.Split(",").ToList();
var flowTaskNodeEntityList = flowTaskNodeList.FindAll(x => nextNodes.Contains(x.NodeCode));
flowTaskNodeEntities.AddRange(flowTaskNodeEntityList);
foreach (var item in flowTaskNodeEntityList)
{
if (!FlowTaskNodeTypeEnum.end.ParseToString().Equals(item.NodeCode))
{
await GetAllNextNode(flowTaskNodeList, item.NodeNext, flowTaskNodeEntities);
}
}
}
///
/// 递归节点.
///
/// 所有节点.
/// 当前节点.
/// 指定节点下所有节点.
/// 向上递归.
public async Task RecursiveNode(List flowTaskNodeList, string nodeCode, List flowTaskNodeEntities, bool isUp = false)
{
var thisNodeEntity = flowTaskNodeList.Find(x => x.NodeCode == nodeCode);
var flowTaskNodeEntityList = new List();
var nodeType = string.Empty;
if (isUp)
{
flowTaskNodeEntityList = flowTaskNodeList.FindAll(x => !FlowTaskNodeTypeEnum.end.ParseToString().Equals(x.NodeCode) && x.NodeNext.Contains(nodeCode));
nodeType = FlowTaskNodeTypeEnum.start.ParseToString();
}
else
{
var nextNodes = thisNodeEntity.NodeNext.Split(",").ToList();
flowTaskNodeEntityList = flowTaskNodeList.FindAll(x => nextNodes.Contains(x.NodeCode));
nodeType = FlowTaskNodeTypeEnum.end.ParseToString();
}
foreach (var item in flowTaskNodeEntityList)
{
if (!flowTaskNodeEntities.Any(x => x.Id == item.Id))
{
flowTaskNodeEntities.Add(item);
}
if (!nodeType.Equals(item.NodeCode))
{
await RecursiveNode(flowTaskNodeList, item.NodeCode, flowTaskNodeEntities, isUp);
}
}
}
///
/// 根据选择分支变更节点.
///
/// 任务参数.
public async Task ChangeNodeListByBranch(FlowTaskParamter flowTaskParamter)
{
if (flowTaskParamter.branchList.IsNotEmptyOrNull() && flowTaskParamter.branchList.Count > 0)
{
flowTaskParamter.flowTaskNodeEntityList.RemoveAll(x => FlowTaskNodeTypeEnum.end.ParseToString().Equals(x.NodeCode));
foreach (var item in flowTaskParamter.flowTaskNodeEntityList)
{
if (flowTaskParamter.flowTaskNodeEntity.Id.IsNotEmptyOrNull() && flowTaskParamter.flowTaskNodeEntity.Id.Equals(item.Id))
{
item.NodeNext = string.Join(",", flowTaskParamter.branchList);
}
item.State = "1";
item.SortCode = null;
}
UpdateNodeSort(flowTaskParamter.flowTaskNodeEntityList);
await _flowTaskRepository.UpdateTaskNode(flowTaskParamter.flowTaskNodeEntityList);
//重新获取当前节点
flowTaskParamter.flowTaskNodeEntity = flowTaskParamter.flowTaskNodeEntityList.Find(x => x.Id == flowTaskParamter.flowTaskNodeEntity.Id);
}
}
///
/// 驳回处理.
///
/// 任务参数.
/// 驳回节点.
/// 驳回节点编码.
/// 驳回节点完成度.
///
public async Task> RejectManager(FlowTaskParamter flowTaskParamter, List rejectNodeList, List rejectNodeCodeList, List rejectNodeCompletion)
{
if (!rejectNodeList.Any()) throw Oops.Oh(ErrorCode.WF0032);
// 保存驳回现有数据.
if (flowTaskParamter.approversProperties.rejectType == 2)
{
flowTaskParamter.flowTaskEntity.RejectDataId = await _flowTaskRepository.CreateRejectData(flowTaskParamter.flowTaskEntity.Id, flowTaskParamter.flowTaskNodeEntity.Id);
}
// 驳回节点下所有节点.
var rejectNodeNextAllList = new List();
await GetAllNextNode(flowTaskParamter.flowTaskNodeEntityList, rejectNodeList.FirstOrDefault().NodeNext, rejectNodeNextAllList);
// 驳回到发起
if (rejectNodeList.Any(x => FlowTaskNodeTypeEnum.start.ParseToString().Equals(x.NodeType)))
{
flowTaskParamter.flowTaskEntity.ThisStepId = rejectNodeList.FirstOrDefault().NodeCode;
flowTaskParamter.flowTaskEntity.ThisStep = "开始";
flowTaskParamter.flowTaskEntity.Completion = 0;
flowTaskParamter.flowTaskEntity.FlowUrgent = 0;
flowTaskParamter.flowTaskEntity.Status = FlowTaskStatusEnum.Reject.ParseToInt();
}
else
{
// 清空驳回节点下所有节点候选人/异常节点处理人
if (flowTaskParamter.approversProperties.rejectType == 1)
{
_flowTaskRepository.DeleteFlowCandidates(x => rejectNodeNextAllList.Select(x => x.Id).Contains(x.TaskNodeId));
}
flowTaskParamter.flowTaskEntity.Completion = rejectNodeCompletion.Min();
if (flowTaskParamter.flowTaskNodeEntity.NodeUp == "1")
{
flowTaskParamter.flowTaskEntity.ThisStepId = GetRejectThisStepId(rejectNodeNextAllList, rejectNodeCodeList, flowTaskParamter.flowTaskEntity.ThisStepId);
flowTaskParamter.flowTaskEntity.ThisStep = GetThisStep(flowTaskParamter.flowTaskNodeEntityList, flowTaskParamter.flowTaskEntity.ThisStepId);
}
else
{
flowTaskParamter.flowTaskEntity.ThisStep = string.Join(",", rejectNodeCodeList);
flowTaskParamter.flowTaskEntity.ThisStepId = string.Join(",", rejectNodeList.Select(x => x.NodeCode).ToArray());
}
var rejectNodeIds = rejectNodeList.Union(rejectNodeNextAllList).ToList().Select(x => x.Id).ToList();
await RejectUpdateTaskNode(rejectNodeList.Union(rejectNodeNextAllList).ToList(), 0);
// 删除驳回节点下所有经办
var rejectList = (await _flowTaskRepository.GetTaskOperatorList(x => x.TaskId == flowTaskParamter.flowTaskEntity.Id && rejectNodeIds.Contains(x.TaskNodeId))).OrderBy(x => x.HandleTime).Select(x => x.Id).ToList();
await _flowTaskRepository.DeleteTaskOperator(rejectList);
//删除驳回节点经办记录
var rejectRecodeList = (await _flowTaskRepository.GetTaskOperatorRecordList(x => x.TaskId == flowTaskParamter.flowTaskEntity.Id && rejectNodeIds.Contains(x.TaskNodeId))).OrderBy(x => x.HandleTime).Select(x => x.Id).ToList();
await _flowTaskRepository.DeleteTaskOperatorRecord(rejectRecodeList);
}
return rejectNodeNextAllList.FindAll(x => FlowTaskNodeTypeEnum.subFlow.Equals(x.NodeType));
}
#endregion
}