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;
}
}