using JNPF.Common.Const; using JNPF.Common.Core.Manager; using JNPF.Common.Enums; using JNPF.Common.Extension; using JNPF.Common.Filter; using JNPF.Common.Manager; using JNPF.Common.Models.User; using JNPF.Common.Models.WorkFlow; using JNPF.Common.Security; using JNPF.FriendlyException; using JNPF.RemoteRequest.Extensions; using JNPF.Systems.Entitys.Dto.User; using JNPF.Systems.Entitys.Permission; using JNPF.Systems.Interfaces.Permission; using JNPF.UnifyResult; using JNPF.WorkFlow.Entitys.Entity; using JNPF.WorkFlow.Entitys.Enum; using JNPF.WorkFlow.Entitys.Model; using JNPF.WorkFlow.Entitys.Model.Properties; using JNPF.WorkFlow.Interfaces.Repository; using Mapster; using Newtonsoft.Json.Linq; using SqlSugar; namespace JNPF.WorkFlow.Manager; public class FlowTaskUserUtil { private readonly IFlowTaskRepository _flowTaskRepository; private readonly IUsersService _usersService; private readonly IOrganizeService _organizeService; private readonly IDepartmentService _departmentService; private readonly IUserRelationService _userRelationService; private readonly IUserManager _userManager; private readonly ICacheManager _cacheManager; public FlowTaskUserUtil(IFlowTaskRepository flowTaskRepository, IUsersService usersService, IOrganizeService organizeService, IDepartmentService departmentService, IUserRelationService userRelationService, IUserManager userManager, ICacheManager cacheManager) { _flowTaskRepository = flowTaskRepository; _usersService = usersService; _organizeService = organizeService; _departmentService = departmentService; _userRelationService = userRelationService; _userManager = userManager; _cacheManager = cacheManager; } /// /// 获取节点审批人员id. /// /// 当前任务参数. /// 节点属性. /// 节点实体. /// public async Task> GetFlowUserId(FlowTaskParamter flowTaskParamter, ApproversProperties approversProperties, FlowTaskNodeEntity flowTaskNodeEntity) { var userIdList = new List(); // 获取全部用户id var userList1 = await _usersService.GetUserListByExp(x => x.DeleteMark == null && x.EnabledMark == 1, u => new UserEntity() { Id = u.Id }); // 发起者本人. var userEntity = _usersService.GetInfoByUserId(flowTaskParamter.flowTaskEntity.CreatorUserId); switch (approversProperties.assigneeType) { // 发起者主管 case (int)FlowTaskOperatorEnum.LaunchCharge: var crDirector = await GetManagerByLevel(userEntity.ManagerId, approversProperties.managerLevel); if (crDirector.IsNotEmptyOrNull()) userIdList.Add(crDirector); break; // 发起者本人 case (int)FlowTaskOperatorEnum.InitiatorMe: userIdList.Add(userEntity.Id); break; // 部门主管 case (int)FlowTaskOperatorEnum.DepartmentCharge: var organizeEntity = await _organizeService.GetInfoById(userEntity.OrganizeId); if (organizeEntity.IsNotEmptyOrNull() && organizeEntity.OrganizeIdTree.IsNotEmptyOrNull()) { var orgTree = organizeEntity.OrganizeIdTree.Split(",").Reverse().ToList(); if (orgTree.Count >= approversProperties.departmentLevel) { var orgId = orgTree[approversProperties.departmentLevel - 1]; var organize = await _organizeService.GetInfoById(orgId); if (organize.IsNotEmptyOrNull() && organize.ManagerId.IsNotEmptyOrNull()) { userIdList.Add(organize.ManagerId); } } } break; // 表单变量 case (int)FlowTaskOperatorEnum.VariableApprover: var jd = flowTaskParamter.formData.ToObject(); var fieldValueList = new List(); var formField = approversProperties.formField; if (approversProperties.assignList.Any() && flowTaskParamter.flowTaskNodeEntity.IsNotEmptyOrNull()) { var ruleList = approversProperties.assignList.Find(x => x.nodeId == flowTaskParamter.flowTaskNodeEntity.NodeCode)?.ruleList; if (ruleList.IsNotEmptyOrNull() && ruleList.Any(x => x.childField == approversProperties.formField)) { formField = ruleList.Find(x => x.childField == approversProperties.formField)?.parentField; } } if (jd.ContainsKey(formField)) { if (jd[formField] is JArray) { fieldValueList = jd[formField].ToObject>(); } else { if (jd[formField].ToString().IsNotEmptyOrNull()) { fieldValueList = jd[formField].ToString().Split(",").ToList(); } } } userIdList = _userRelationService.GetUserId(fieldValueList, string.Empty); break; // 环节(提交时下个节点是环节就跳过,审批则看环节节点是否是当前节点的上级) case (int)FlowTaskOperatorEnum.LinkApprover: if (flowTaskParamter.flowTaskNodeEntityList.Any(x => x.NodeCode.Equals(approversProperties.nodeId) && x.SortCode < flowTaskNodeEntity.SortCode)) { // 环节节点所有经办人(过滤掉加签人) userIdList = (await _flowTaskRepository.GetTaskOperatorRecordList(x => x.TaskId == flowTaskNodeEntity.TaskId && !SqlFunc.IsNullOrEmpty(x.NodeCode) && x.NodeCode.Equals(approversProperties.nodeId) && x.HandleStatus == 1 && x.Status == 0)) .Where(x => HasFreeApprover(x.TaskOperatorId).Result).Where(x => x.HandleId.IsNotEmptyOrNull()).Select(x => x.HandleId).Distinct().ToList(); } break; // 接口(接口结构为{"code":200,"data":{"handleId":"admin"},"msg":""}) case (int)FlowTaskOperatorEnum.ServiceApprover: try { var Token = _userManager.ToKen.IsNotEmptyOrNull() ? _userManager.ToKen : _cacheManager.Get>(CommonConst.CACHEKEYONLINEUSER + _userManager.TenantId).Find(x => x.userId == _userManager.UserId).token; var data = await approversProperties.getUserUrl.SetHeaders(new { Authorization = Token }).GetAsStringAsync(); var result = data.ToObject>(); if (result.IsNotEmptyOrNull()) { var resultJobj = result.data.ToObject(); if (result.code == 200) { var handleId = resultJobj["handleId"].ToString(); var handleIdList = handleId.Split(",").ToList(); var userList2 = await _usersService.GetUserListByExp(x => x.DeleteMark == null, u => new UserEntity() { Id = u.Id }); // 利用list交集方法过滤非用户数据 userIdList = userList2.Select(x => x.Id).Intersect(handleIdList).ToList(); } } } catch (AppFriendlyException ex) { break; } break; // 候选人 case (int)FlowTaskOperatorEnum.CandidateApprover: userIdList = _flowTaskRepository.GetFlowCandidates(flowTaskNodeEntity.Id); break; default: userIdList = (await GetUserDefined(approversProperties)); userIdList = await GetExtraRuleUsers(userIdList, approversProperties.extraRule, flowTaskNodeEntity.TaskId); break; } userIdList = userList1.Select(x => x.Id).Intersect(userIdList).ToList();// 过滤掉作废人员和非用户人员 if (userIdList.Count == 0) { userIdList = _flowTaskRepository.GetFlowCandidates(flowTaskNodeEntity.Id); } return userIdList.Distinct().ToList(); } /// /// 附加条件过滤. /// /// 过滤用户. /// 过滤规则. /// 任务id. /// private async Task> GetExtraRuleUsers(List userList, string extraRule, string taskId) { var flowUserEntity = _flowTaskRepository.GetFlowUserEntity(taskId); if (flowUserEntity.IsNullOrEmpty()) { var subordinate = (await _usersService.GetUserListByExp(u => u.EnabledMark == 1 && u.DeleteMark == null && u.ManagerId == _userManager.UserId)).Select(u => u.Id).ToList().ToJsonString(); flowUserEntity = new FlowUserEntity() { OrganizeId = _userManager.User.OrganizeId, PositionId = _userManager.User.PositionId, ManagerId = _userManager.User.ManagerId, Subordinate = subordinate }; } switch (extraRule) { case "2": userList = _userRelationService.GetUserId("Organize", flowUserEntity.OrganizeId).Intersect(userList).ToList(); break; case "3": userList = _userRelationService.GetUserId("Position", flowUserEntity.PositionId).Intersect(userList).ToList(); break; case "4": userList = new List { flowUserEntity.ManagerId }.Intersect(userList).ToList(); break; case "5": userList = flowUserEntity.Subordinate.ToObject>().Intersect(userList).ToList(); break; case "6": // 直属公司id var companyId = _departmentService.GetCompanyId(flowUserEntity.OrganizeId); var objIdList = (await _departmentService.GetCompanyAllDep(companyId)).Select(x => x.Id).ToList(); objIdList.Add(companyId); userList = _userRelationService.GetUserId(objIdList, "Organize").Intersect(userList).ToList(); break; } return userList; } /// /// 根据类型获取审批人. /// /// 任务参数. /// 下个审批节点数据. /// 操作标识(0:提交,1:审批,3:变更). /// 是否分流合流已完成. /// public async Task AddFlowTaskOperatorEntityByAssigneeType(FlowTaskParamter flowTaskParamter, FlowTaskNodeEntity nextFlowTaskNodeEntity, int type = 1, bool isShuntNodeCompletion = true) { try { if (FlowTaskNodeTypeEnum.approver.ParseToString().Equals(nextFlowTaskNodeEntity.NodeType)) { var approverPropertiers = nextFlowTaskNodeEntity.NodePropertyJson.ToObject(); var errorUserId = new List(); if (flowTaskParamter.errorRuleUserList.IsNotEmptyOrNull() && flowTaskParamter.errorRuleUserList.ContainsKey(nextFlowTaskNodeEntity.NodeCode)) { errorUserId = flowTaskParamter.errorRuleUserList[nextFlowTaskNodeEntity.NodeCode]; } var startProperties = flowTaskParamter.startProperties; if (type == 3) { startProperties.errorRule = "3"; } // 创建人 var userId = type == 0 ? _userManager.UserId : flowTaskParamter.flowTaskEntity.CreatorUserId; var handleIds = await GetFlowUserId(flowTaskParamter, approverPropertiers, nextFlowTaskNodeEntity); if (handleIds.Count == 0 && isShuntNodeCompletion) { switch (startProperties.errorRule) { case "1": handleIds.Add("admin"); break; case "2": if ((await _usersService.GetUserListByExp(x => startProperties.errorRuleUser.Contains(x.Id) && x.DeleteMark == null && x.EnabledMark == 1)).Any()) { handleIds = startProperties.errorRuleUser; } else { handleIds.Add("admin"); } break; case "3": if (errorUserId.IsNotEmptyOrNull() && errorUserId.Count > 0) { handleIds = errorUserId; } else { if (!flowTaskParamter.errorNodeList.Select(x => x.nodeId).Contains(nextFlowTaskNodeEntity.NodeCode)) { flowTaskParamter.errorNodeList.Add(new FlowTaskCandidateModel { nodeId = nextFlowTaskNodeEntity.NodeCode, nodeName = nextFlowTaskNodeEntity.NodeName }); } } break; case "4": // 异常节点下一节点是否存在候选人节点. var falag = flowTaskParamter.flowTaskNodeEntityList. Any(x => nextFlowTaskNodeEntity.NodeNext.Split(",").Contains(x.NodeCode) && FlowTaskNodeTypeEnum.approver.ParseToString().Equals(x.NodeType) && x.NodePropertyJson.ToObject().assigneeType == 7); if (falag) { handleIds.Add("admin"); } else { handleIds.Add("jnpf"); } break; case "5": throw Oops.Oh(ErrorCode.WF0035); } } var index = 0; var isAnyOperatorUser = !_flowTaskRepository.AnyTaskOperatorUser(x => x.TaskNodeId == nextFlowTaskNodeEntity.Id && x.State == "0");// 不存在依次审批插入. var OperatorUserList = new List(); foreach (var item in handleIds) { if (item.IsNotEmptyOrNull()) { if (approverPropertiers.counterSign == 2 && isAnyOperatorUser) { FlowTaskOperatorUserEntity flowTaskOperatorUserEntity = new FlowTaskOperatorUserEntity(); flowTaskOperatorUserEntity.Id = SnowflakeIdHelper.NextId(); flowTaskOperatorUserEntity.NodeCode = nextFlowTaskNodeEntity.NodeCode; flowTaskOperatorUserEntity.NodeName = nextFlowTaskNodeEntity.NodeName; flowTaskOperatorUserEntity.TaskNodeId = nextFlowTaskNodeEntity.Id; flowTaskOperatorUserEntity.TaskId = nextFlowTaskNodeEntity.TaskId; flowTaskOperatorUserEntity.CreatorTime = GetTimerDate(approverPropertiers, flowTaskParamter.flowTaskNodeEntity.NodeCode); flowTaskOperatorUserEntity.Completion = 0; flowTaskOperatorUserEntity.State = "0"; flowTaskOperatorUserEntity.Type = approverPropertiers.assigneeType.ToString(); flowTaskOperatorUserEntity.HandleId = item; flowTaskOperatorUserEntity.SortCode = index++; OperatorUserList.Add(flowTaskOperatorUserEntity); if (index == 1) { flowTaskParamter.flowTaskOperatorEntityList.Add(OperatorUserList.FirstOrDefault().Adapt()); } } else { FlowTaskOperatorEntity flowTaskOperatorEntity = new FlowTaskOperatorEntity(); flowTaskOperatorEntity.Id = SnowflakeIdHelper.NextId(); flowTaskOperatorEntity.NodeCode = nextFlowTaskNodeEntity.NodeCode; flowTaskOperatorEntity.NodeName = nextFlowTaskNodeEntity.NodeName; flowTaskOperatorEntity.TaskNodeId = nextFlowTaskNodeEntity.Id; flowTaskOperatorEntity.TaskId = nextFlowTaskNodeEntity.TaskId; flowTaskOperatorEntity.CreatorTime = GetTimerDate(approverPropertiers, flowTaskParamter.flowTaskNodeEntity.NodeCode); flowTaskOperatorEntity.Completion = 0; flowTaskOperatorEntity.State = "0"; flowTaskOperatorEntity.Type = approverPropertiers.assigneeType.ToString(); flowTaskOperatorEntity.HandleId = item; flowTaskOperatorEntity.SortCode = index++; flowTaskParamter.flowTaskOperatorEntityList.Add(flowTaskOperatorEntity); } } } await _flowTaskRepository.CreateTaskOperatorUser(OperatorUserList); } } catch (AppFriendlyException ex) { throw Oops.Oh(ex.ErrorCode); } } /// /// 获取抄送人. /// /// 任务参数. /// 审批类型(0:拒绝,1:同意). public async Task GetflowTaskCirculateEntityList(FlowTaskParamter flowTaskParamter, int handleStatus) { var circulateUserList = flowTaskParamter.copyIds.IsNotEmptyOrNull() ? flowTaskParamter.copyIds.Split(",").ToList() : new List(); #region 抄送人 if (handleStatus == 1) { var userList = await GetUserDefined(flowTaskParamter.approversProperties, 1); userList = await GetExtraRuleUsers(userList, flowTaskParamter.approversProperties.extraCopyRule, flowTaskParamter.flowTaskOperatorEntity.TaskId); circulateUserList = circulateUserList.Union(userList).ToList(); } foreach (var item in circulateUserList.Distinct()) { flowTaskParamter.flowTaskCirculateEntityList.Add(new FlowTaskCirculateEntity() { Id = SnowflakeIdHelper.NextId(), ObjectType = flowTaskParamter.flowTaskOperatorEntity.Type, ObjectId = item, NodeCode = flowTaskParamter.flowTaskOperatorEntity.NodeCode, NodeName = flowTaskParamter.flowTaskOperatorEntity.NodeName, TaskNodeId = flowTaskParamter.flowTaskOperatorEntity.TaskNodeId, TaskId = flowTaskParamter.flowTaskOperatorEntity.TaskId, CreatorTime = DateTime.Now, }); } #endregion } /// /// 获取自定义人员名称. /// /// 节点属性. /// 用户名称容器. /// 用户id容器. /// public async Task GetUserNameDefined(ApproversProperties approversProperties, List userNameList, List userIdList = null) { if (userIdList == null) { userIdList = (await GetUserDefined(approversProperties)).Distinct().ToList(); } foreach (var item in userIdList) { var name = await _usersService.GetUserName(item); if (name.IsNotEmptyOrNull()) userNameList.Add(name); } } /// /// 获取候选人节点信息. /// /// 返回参数. /// 下一节点集合. /// 所有节点. /// public async Task GetCandidates(List flowTaskCandidateModels, List nextNodeEntities, List nodeEntities) { foreach (var item in nextNodeEntities) { ApproversProperties approverPropertiers = null; var isSubFlow = false;//是否子流程节点. if (FlowTaskNodeTypeEnum.approver.ParseToString().Equals(item.NodeType)) approverPropertiers = item.NodePropertyJson.ToObject(); if (FlowTaskNodeTypeEnum.subFlow.ParseToString().Equals(item.NodeType)) { approverPropertiers = item.NodePropertyJson.ToObject().Adapt(); isSubFlow = true; } if (approverPropertiers.IsNotEmptyOrNull()) { if (approverPropertiers.assigneeType == 7 || approverPropertiers.isBranchFlow) { var candidateItem = new FlowTaskCandidateModel(); candidateItem.nodeId = item.NodeCode; candidateItem.nodeName = item.NodeName; candidateItem.isBranchFlow = approverPropertiers.isBranchFlow; candidateItem.isCandidates = approverPropertiers.assigneeType == 7; var objIds = approverPropertiers.approverRole .Union(approverPropertiers.approverPos) .Union(approverPropertiers.approverOrg) .Union(approverPropertiers.approverGroup).ToList(); var flag = false;//是否有数据 var input = new UserConditionInput() { departIds = objIds, userIds = approverPropertiers.approvers, pagination = new PageInputBase() }; _userRelationService.GetUserPage(input, ref flag); candidateItem.hasCandidates = flag; flowTaskCandidateModels.Add(candidateItem); } } // 子流程节点则要看下一节点是否存在候选人或选择分支 if (isSubFlow) { var subFlowNextNodes = nodeEntities.FindAll(m => item.NodeNext.Contains(m.NodeCode)); await GetCandidates(flowTaskCandidateModels, subFlowNextNodes, nodeEntities); } } } /// /// 候选人员列表. /// /// 下一节点. /// 审批参数. /// 是否存在候选人. /// public dynamic GetCandidateItems(FlowTaskNodeEntity nextNodeEntity, FlowHandleModel flowHandleModel, bool hasCandidates = true) { var approverPropertiers = nextNodeEntity.NodePropertyJson.ToObject(); if (FlowTaskNodeTypeEnum.subFlow.ParseToString().Equals(nextNodeEntity.NodeType)) { approverPropertiers = nextNodeEntity.NodePropertyJson.ToObject().Adapt(); } var objIds = approverPropertiers.approverRole .Union(approverPropertiers.approverPos) .Union(approverPropertiers.approverOrg) .Union(approverPropertiers.approverGroup).ToList(); var input = new UserConditionInput() { departIds = objIds, userIds = approverPropertiers.approvers, pagination = flowHandleModel }; return _userRelationService.GetUserPage(input, ref hasCandidates); } /// /// 获取子流程下异常节点信息. /// /// 任务参数. /// 下一节点集合. /// public async Task GetErrorNode(FlowTaskParamter flowTaskParamter, List nextNodeEntities) { try { foreach (var item in nextNodeEntities) { if (FlowTaskNodeTypeEnum.approver.ParseToString().Equals(item.NodeType)) { var approverPropertiers = item.NodePropertyJson.ToObject(); var list = await GetFlowUserId(flowTaskParamter, approverPropertiers, item); if (list.Count == 0) { if (flowTaskParamter.startProperties.errorRule == "3" && !flowTaskParamter.errorNodeList.Select(x => x.nodeId).Contains(item.NodeCode)) { var candidateItem = new FlowTaskCandidateModel(); candidateItem.nodeId = item.NodeCode; candidateItem.nodeName = item.NodeName; flowTaskParamter.errorNodeList.Add(candidateItem); } if (flowTaskParamter.startProperties.errorRule == "5") throw Oops.Oh(ErrorCode.WF0035); } } else if (FlowTaskNodeTypeEnum.subFlow.ParseToString().Equals(item.NodeType)) { var subFlowNextNodes = flowTaskParamter.flowTaskNodeEntityList.FindAll(m => item.NodeNext.Contains(m.NodeCode)); await GetErrorNode(flowTaskParamter, subFlowNextNodes); } } } catch (AppFriendlyException ex) { throw Oops.Oh(ex.ErrorCode); } } /// /// 获取子流程发起人. /// /// 子流程属性. /// 当前任务参数. /// 子流程节点. /// public async Task> GetSubFlowCrUser(ChildTaskProperties childTaskProperties, FlowTaskParamter flowTaskParamter, FlowTaskNodeEntity flowTaskNodeEntity) { var approverPropertiers = childTaskProperties.Adapt(); var childTaskCrUserList = await GetFlowUserId(flowTaskParamter, approverPropertiers, flowTaskNodeEntity); if (childTaskCrUserList.Count == 0) { switch (childTaskProperties.errorRule) { case "2": if ((await _usersService.GetUserListByExp(x => childTaskProperties.errorRuleUser.Contains(x.Id) && x.DeleteMark == null && x.EnabledMark == 1)).Any()) { childTaskCrUserList = childTaskProperties.errorRuleUser; } else { childTaskCrUserList.Add("admin"); } break; case "6": childTaskCrUserList.Add(flowTaskParamter.flowTaskEntity.CreatorUserId); break; default: childTaskCrUserList.Add("admin"); break; } } return childTaskCrUserList; } /// /// 获取审批人名称. /// /// 当前节点. /// 任务参数. /// 流程实体. /// public async Task GetApproverUserName(FlowTaskNodeModel flowTaskNodeModel, FlowTaskParamter flowTaskParamter, FlowJsonModel flowJsonModel) { var userNameList = new List(); var userName = await _usersService.GetUserName(flowTaskParamter.flowTaskEntity.CreatorUserId); if (flowTaskNodeModel.nodeType.Equals(FlowTaskNodeTypeEnum.start.ParseToString())) { if (flowJsonModel.visibleType == 0) { userNameList.Add(userName); } else { await GetUserNameDefined(flowTaskParamter.startProperties.Adapt(), userNameList); } } else if (flowTaskNodeModel.nodeType.Equals(FlowTaskNodeTypeEnum.subFlow.ParseToString())) { var subFlowProperties = flowTaskNodeModel.nodePropertyJson.ToObject(); var userIdList = (await _flowTaskRepository.GetTaskList(x => subFlowProperties.childTaskId.Contains(x.Id))).Select(x => x.CreatorUserId).ToList(); var approverProperties = subFlowProperties.Adapt(); if (userIdList.Count == 0) { userIdList = await GetFlowUserId(flowTaskParamter, approverProperties, flowTaskNodeModel.Adapt()); } await GetUserNameDefined(approverProperties, userNameList, userIdList); } else { var approverProperties = flowTaskNodeModel.nodePropertyJson.ToObject(); var userIdList = (await _flowTaskRepository.GetTaskOperatorList(x => x.TaskNodeId == flowTaskNodeModel.id && SqlFunc.IsNullOrEmpty(x.ParentId) && !x.State.Equals("-1"))).Select(x => x.HandleId).Distinct().ToList(); if (approverProperties.counterSign == 2) { userIdList = (await _flowTaskRepository.GetTaskOperatorUserList(x => x.TaskId == flowTaskNodeModel.taskId && x.TaskNodeId == flowTaskNodeModel.id)).Select(x => x.HandleId).ToList(); } if (!userIdList.Any()) { userIdList = await GetFlowUserId(flowTaskParamter, approverProperties, flowTaskNodeModel.Adapt()); } await GetUserNameDefined(approverProperties, userNameList, userIdList); } return string.Join(",", userNameList.Distinct()); } /// /// 获取级别主管. /// /// 主管id. /// 级别. /// public async Task GetManagerByLevel(string managerId, int level) { --level; if (level == 0) { return managerId; } else { var manager = await _usersService.GetInfoByUserIdAsync(managerId); return manager.IsNullOrEmpty() ? string.Empty : await GetManagerByLevel(manager.ManagerId, level); } } /// /// 判断经办记录人是否加签且加签是否完成. /// /// 经办id. /// public async Task HasFreeApprover(string id) { var entityList = await GetOperator(id, new List()); if (entityList.Count == 0) { return true; } else { return !entityList.Any(x => x.HandleStatus.IsEmpty() || x.HandleStatus == 0); } } /// /// 递归获取加签人. /// /// 经办id. /// 所有经办. /// public async Task> GetOperator(string id, List flowTaskOperatorEntities) { var childEntity = await _flowTaskRepository.GetTaskOperatorInfo(x => x.ParentId == id && !x.State.Equals("-1")); if (childEntity.IsNotEmptyOrNull()) { childEntity.State = "-1"; flowTaskOperatorEntities.Add(childEntity); return await GetOperator(childEntity.Id, flowTaskOperatorEntities); } else { return flowTaskOperatorEntities; } } /// /// 递归获取加签人. /// /// 经办id. /// 所有经办. /// public async Task> GetOperatorNew(string id, List flowTaskOperatorEntities) { var childEntity = await _flowTaskRepository.GetTaskOperatorInfo(x => x.HandleType == id && !x.State.Equals("-1")); if (childEntity.IsNotEmptyOrNull()) { childEntity.State = "-1"; flowTaskOperatorEntities.Add(childEntity); return await GetOperatorNew(childEntity.Id, flowTaskOperatorEntities); } else { return flowTaskOperatorEntities; } } /// /// 获取自定义人员. /// /// 节点属性. /// 0:审批人员,1:抄送人员. /// public async Task> GetUserDefined(ApproversProperties approversProperties, int userType = 0) { var userIdList = new List(); var objIdList = new List(); if (userType == 0) { userIdList = approversProperties.approvers; objIdList = approversProperties.approverRole .Union(approversProperties.approverPos) .Union(approversProperties.approverOrg) .Union(approversProperties.approverGroup).ToList(); } else { userIdList = approversProperties.circulateUser; objIdList = approversProperties.circulateRole .Union(approversProperties.circulatePosition) .Union(approversProperties.circulateOrg) .Union(approversProperties.circulateGroup).ToList(); } userIdList = userIdList.Union(_userRelationService.GetUserId(objIdList, string.Empty)).ToList(); return userIdList; } /// /// 获取定时器节点定时结束时间. /// /// 定时器节点属性. /// 定时器节点编码. /// public DateTime GetTimerDate(ApproversProperties approverPropertiers, string nodeCode) { var nowTime = DateTime.Now; if (approverPropertiers.timerList.Count > 0) { string upNodeStr = string.Join(",", approverPropertiers.timerList.Select(x => x.upNodeCode).ToArray()); if (upNodeStr.Contains(nodeCode)) { foreach (var item in approverPropertiers.timerList) { var result = DateTime.Now.AddDays(item.day).AddHours(item.hour).AddMinutes(item.minute).AddSeconds(item.second); if (result > nowTime) { nowTime = result; } } } } return nowTime; } }