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 }