123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398 |
- using System.Collections.Generic;
- using System.Linq;
- using System.Threading.Tasks;
- using GxPress.Common.Tools;
- using GxPress.Entity.WorkFlow;
- using GxPress.Entity.WorkFlowDto;
- using GxPress.Entity.WorkProcessDto;
- using GxPress.EnumConst;
- namespace GxPress.Service.Implement
- {
- public partial class FlowService
- {
- public async Task<List<ProcessNodeDto>> GetNodesAsync(FlowDto flow, List<ProcessNodeDto> nodes)
- {
- var nodeList = new List<ProcessNodeDto>();
- //var nodes = await _processService.GetNodesAsync(flow.ProcessId, 0);
- //var fields = await _processFieldRepository.GetListAsync(flow.ProcessId);
- foreach (var processNodeDto in nodes)
- {
- if (processNodeDto.Type == nameof(ProcessNodeTypeConst.Switch))
- {
- var theCase = GetCase(processNodeDto.Children, flow);
- nodeList.AddRange(await GetNodesAsync(flow, theCase.Children));
- }
- else if (processNodeDto.Type == nameof(ProcessNodeTypeConst.Start) ||
- processNodeDto.Type == nameof(ProcessNodeTypeConst.Approver) ||
- processNodeDto.Type == nameof(ProcessNodeTypeConst.End))
- {
- nodeList.Add(processNodeDto);
- }
- }
- return nodeList;
- }
- private ProcessNodeDto GetCase(List<ProcessNodeDto> cases, FlowDto flow)
- {
- cases = cases.OrderBy(x => x.CaseLevel).ToList();
- var rightNode = cases.LastOrDefault();
- foreach (var caseNode in cases)
- {
- var isSuccess = false;
- foreach (var condition in caseNode.Conditions)
- {
- var field = flow.Fields?.FirstOrDefault(x => x.Id == condition.FieldId);
- if (field != null)
- {
- if (field.Type == nameof(FieldTypeConst.Number) ||
- field.Type == nameof(FieldTypeConst.Currency))
- {
- var value = StringUtils.ToInt(field.Value);
- if (condition.Operator == nameof(OperatorConst.Equals))
- {
- if (value == condition.IntValue)
- {
- isSuccess = true;
- break;
- }
- }
- else if (condition.Operator == nameof(OperatorConst.NotEquals))
- {
- if (value != condition.IntValue)
- {
- isSuccess = true;
- break;
- }
- }
- else if (condition.Operator == nameof(OperatorConst.GreatThan))
- {
- if (value > condition.IntValue)
- {
- isSuccess = true;
- break;
- }
- }
- else if (condition.Operator == nameof(OperatorConst.LessThan))
- {
- if (value < condition.IntValue)
- {
- isSuccess = true;
- break;
- }
- }
- }
- else if (field.Type == nameof(FieldTypeConst.Radio))
- {
- var value = field.Value;
- if (condition.Operator == nameof(OperatorConst.In))
- {
- if (condition.StringValues.Contains(value))
- {
- isSuccess = true;
- break;
- }
- }
- else if (condition.Operator == nameof(OperatorConst.NotIn))
- {
- if (!condition.StringValues.Contains(value))
- {
- isSuccess = true;
- break;
- }
- }
- }
- else if (field.Type == nameof(FieldTypeConst.Text))
- {
- var value = field.Value;
- if (condition.Operator == nameof(OperatorConst.Equals))
- {
- if (condition.StringValue == value)
- {
- isSuccess = true;
- break;
- }
- }
- else if (condition.Operator == nameof(OperatorConst.NotEquals))
- {
- if (condition.StringValue != value)
- {
- isSuccess = true;
- break;
- }
- }
- }
- }
- }
- if (isSuccess)
- {
- rightNode = caseNode;
- break;
- }
- }
- return rightNode;
- }
- /// <summary>
- /// 获取用户ID
- /// </summary>
- /// <param name="node"></param>
- /// <returns></returns>
- public async Task<List<int>> GetListUserAsync(ProcessNodeDto node)
- {
- if (node.Type == nameof(ProcessNodeTypeConst.Start) || node.Type == nameof(ProcessNodeTypeConst.End))
- {
- var ccList = await _ruleCarbonCopyRepository.GetListAsync(node.Id);
- var userIdList = new List<int>();
- foreach (var ruleCarbonCopy in ccList)
- {
- userIdList.AddRange(await GetUserIdListAsync(ruleCarbonCopy));
- }
- return userIdList;
- }
- else if (node.Type == nameof(ProcessNodeTypeConst.Approver))
- {
- var acList = await _ruleApproverCheckRepository.GetListAsync(node.Id);
- var userIdList = new List<int>();
- foreach (var ruleApproverCheck in acList)
- {
- userIdList.AddRange(await GetUserIdListAsync(ruleApproverCheck));
- }
- return userIdList;
- }
- return new List<int>();
- }
- /// <summary>
- /// 工作流程条件判断
- /// </summary>
- /// <param name="flow"></param>
- /// <returns></returns>
- public async Task NodeExecuteSwitchAsync(FlowDto flow, ProcessNodeDto processNode)
- {
- //查询是否有条件 Switch
- var processNodes = await _processNodeRepository.GetAllAsync(flow.ProcessId);
- //查询Case
- var caseList = processNodes.Where(n => n.ParentId == processNode.Id).ToList();
- var success = false;
- foreach (var caseValue in caseList)
- {
- if (success)
- break;
- //查询Approver
- var approvers = processNodes.Where(n => n.ParentId == caseValue.Id);
- foreach (var node in approvers)
- {
- //查询是否有条件
- if (node.ParentId > 0)
- {
- var ruleConditions = await _ruleConditionRepository.GetListAsync(node.ParentId);
- if (ruleConditions.Count() > 0)
- success = false;
- else
- success = true;
- foreach (var item in ruleConditions)
- {
- //判断是否等于
- if (item.Operator.Equals("Equals"))
- {
- foreach (var field in flow.Fields)
- {
- if (field.Id == item.FieldId)
- if (field.Value.Equals(item.IntValue))
- success = true;
- }
- }
- if (item.Operator.Equals("In"))
- {
- foreach (var field in flow.Fields)
- {
- if (field.Id == item.FieldId)
- if (field.Value.Equals(item.StringValue))
- success = true;
- }
- }
- if (item.Operator.Equals("NotIn"))
- {
- foreach (var field in flow.Fields)
- {
- if (field.Id == item.FieldId)
- if (field.Value.Equals(item.StringValue))
- {
- success = true;
- break;
- }
- else
- break;
- }
- }
- }
- }
- if (!success)
- break;
- }
- //
- if (success)
- {
- approvers = processNodes.Where(n => n.ParentId == caseValue.Id);
- foreach (var node in approvers)
- {
- //获取抄送人
- var ccList = await _ruleCarbonCopyRepository.GetListAsync(node.Id);
- var userIdList = new List<int>();
- foreach (var ruleCarbonCopy in ccList)
- {
- userIdList.AddRange(await GetUserIdListAsync(ruleCarbonCopy));
- }
- await TaskCarbonCopyAsync(userIdList.Distinct(), flow);
- var acList = await _ruleApproverCheckRepository.GetListAsync(node.Id);
- //获取审核人 是否是或签
- if (node.ApprovalType == "Or")
- {
- flow.IsCaseOr = true;
- flow.ParentId = node.Id;
- }
- //审核人
- acList = await _ruleApproverCheckRepository.GetListAsync(node.Id);
- userIdList = new List<int>();
- foreach (var ruleApproverCheck in acList)
- {
- userIdList.AddRange(await GetUserIdListAsync(ruleApproverCheck));
- }
- await TaskApproverCheckAsync(userIdList.Distinct(), flow);
- }
- break;
- }
- }
- }
- public async Task NodeExecuteAsync(FlowDto flow, ProcessNodeDto node)
- {
- //_ruleCarbonCopyRepository = ruleCarbonCopyRepository;
- //_ruleApproverCheckRepository = ruleApproverCheckRepository;
- //_ruleConditionRepository = ruleConditionRepository;
- if (node.Type == nameof(ProcessNodeTypeConst.Start) || node.Type == nameof(ProcessNodeTypeConst.End))
- {
- var ccList = await _ruleCarbonCopyRepository.GetListAsync(node.Id);
- var userIdList = new List<int>();
- foreach (var ruleCarbonCopy in ccList)
- {
- userIdList.AddRange(await GetUserIdListAsync(ruleCarbonCopy));
- }
- await TaskCarbonCopyAsync(userIdList.Distinct(), flow);
- }
- else if (node.Type == nameof(ProcessNodeTypeConst.Approver))
- {
- var acList = await _ruleApproverCheckRepository.GetListAsync(node.Id);
- //获取审核人 是否是或签
- if (node.ApprovalType == "Or")
- {
- flow.IsCaseOr = true;
- flow.ParentId = node.Id;
- }
- else
- {
- flow.IsCaseOr = false;
- flow.ParentId = 0;
- }
- var userIdList = new List<int>();
- foreach (var ruleApproverCheck in acList)
- {
- userIdList.AddRange(await GetUserIdListAsync(ruleApproverCheck));
- }
- await TaskApproverCheckAsync(userIdList.Distinct(), flow);
- }
- }
- /// <summary>
- /// 抄送人
- /// </summary>
- /// <param name="userIdList"></param>
- /// <param name="flow"></param>
- /// <returns></returns>
- private async Task TaskCarbonCopyAsync(IEnumerable<int> userIdList, FlowDto flow)
- {
- foreach (var userId in userIdList)
- {
- var todo = new FlowTodo
- {
- ProcessId = flow.ProcessId,
- FlowId = flow.Id,
- UserId = userId,
- Type = nameof(TodoTypeConst.CarbonCopy),
- IsDone = false,
- IsOperate = false,
- };
- await _flowTodoRepository.InsertAsync(todo);
- }
- }
- /// <summary>
- /// 审核人
- /// </summary>
- /// <param name="userIdList"></param>
- /// <param name="flow"></param>
- /// <returns></returns>
- private async Task TaskApproverCheckAsync(IEnumerable<int> userIdList, FlowDto flow)
- {
- foreach (var userId in userIdList)
- {
- var todo = new FlowTodo
- {
- ProcessId = flow.ProcessId,
- FlowId = flow.Id,
- UserId = userId,
- Type = nameof(TodoTypeConst.ApproverCheck),
- IsDone = false,
- IsOperate = false,
- IsCaseOr = flow.IsCaseOr,
- ParentId = flow.ParentId
- };
- await _flowTodoRepository.InsertAsync(todo);
- }
- }
- private async Task<List<int>> GetUserIdListAsync(List<ApproverCheck> approverChecks)
- {
- var allUserIdList = new List<int>();
- foreach (var multipleUser in approverChecks)
- {
- var userIdList = await GetUserIdListAsync(multipleUser);
- foreach (var userId in userIdList)
- {
- if (!allUserIdList.Contains(userId))
- {
- allUserIdList.Add(userId);
- }
- }
- }
- return allUserIdList;
- }
- private async Task<List<int>> GetUserIdListAsync(IMultipleUser multipleUser)
- {
- if (multipleUser != null)
- {
- if (multipleUser.UserId > 0)
- {
- return new List<int> { multipleUser.UserId };
- }
- if (multipleUser.RoleId > 0)
- {
- return (await _userRepository.GetUserIdListByRoleIdAsync(multipleUser.RoleId)).ToList();
- }
- if (multipleUser.DepartmentId > 0)
- {
- return (await _userRepository.GetUserIdListByDepartmentIdAsync(multipleUser.DepartmentId)).ToList();
- }
- }
- return new List<int>();
- }
- }
- }
|