using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using Datory; 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> GetNodesAsync(FlowDto flow, List nodes) { var nodeList = new List(); //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 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; } /// /// 获取用户ID /// /// /// public async Task> 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(); 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(); foreach (var ruleApproverCheck in acList) { userIdList.AddRange(await GetUserIdListAsync(ruleApproverCheck)); } return userIdList; } return new List(); } /// /// 工作流程条件判断 /// /// /// 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(); 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(); 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(); foreach (var ruleCarbonCopy in ccList) { userIdList.AddRange(await GetUserIdListAsync(ruleCarbonCopy)); } await TaskCarbonCopyAsync(userIdList.Distinct(), flow); } else if (node.Type == nameof(ProcessNodeTypeConst.Approver)) { #region 抄送人 var ccList = await _ruleCarbonCopyRepository.GetListAsync(node.Id); var userIdList = new List(); foreach (var ruleCarbonCopy in ccList) { userIdList.AddRange(await GetUserIdListAsync(ruleCarbonCopy)); } await TaskCarbonCopyAsync(userIdList.Distinct(), flow); #endregion #region 审核人 var acList = await _ruleApproverCheckRepository.GetListAsync(node.Id); //获取审核人 是否是或签 if (node.ApprovalType == "Or") { flow.IsCaseOr = true; flow.ParentId = node.Id; } else { flow.IsCaseOr = false; flow.ParentId = node.Id; //flow.ParentId = 0; } userIdList = new List(); foreach (var ruleApproverCheck in acList) { userIdList.AddRange(await GetUserIdListAsync(ruleApproverCheck)); } await TaskApproverCheckAsync(userIdList.Distinct(), flow); #endregion } var flowTodoCount = await _flowTodoRepository.CountAsync(Q.Where(nameof(Entity.WorkFlow.FlowTodo.IsOperate), true).Where(nameof(Entity.WorkFlow.FlowTodo.FlowId), flow.Id).Where(nameof(Entity.WorkFlow.FlowTodo.Type), nameof(TodoTypeConst.ApproverCheck))); if (flowTodoCount == 0) { //修改可操作人 var flowTodo = await _flowTodoRepository.GetAsync(Q.Where(nameof(Entity.WorkFlow.FlowTodo.IsChecked), false).Where(nameof(Entity.WorkFlow.FlowTodo.IsDone), false).Where(nameof(Entity.WorkFlow.FlowTodo.Type), nameof(TodoTypeConst.ApproverCheck)).Where(nameof(Entity.WorkFlow.FlowTodo.FlowId), flow.Id).OrderBy(nameof(Entity.WorkFlow.FlowTodo.Sort))); if (flowTodo != null && flowTodo.IsCaseOr && flowTodo.ParentId > 0) { var flowDtos = await _flowTodoRepository.GetAllAsync(Q.Where(nameof(Entity.WorkFlow.FlowTodo.ParentId), flowTodo.ParentId).Where(nameof(Entity.WorkFlow.FlowTodo.IsCaseOr), true).Where(nameof(Entity.WorkFlow.FlowTodo.FlowId), flowTodo.FlowId)); foreach (var item in flowDtos) { item.IsOperate = true; await _flowTodoRepository.UpdateAsync(item); //发送短信 var user = await _userRepository.GetAsync(item.UserId); //Common.Sms.AliySms.FolwCheckSendSms(user.Phone); //Common.Sms.MasSms.SendSmsTemplate(new List() { user.Phone }, "c9bdae1685514a9b821299720e2c5fe8"); await smsService.SendSmsTemplate(new List() { user.Phone }, "c9bdae1685514a9b821299720e2c5fe8", flow.Id, AllTypeConst.Flow.GetHashCode()); } } else { if (flowTodo != null) { flowTodo.IsOperate = true; await _flowTodoRepository.UpdateAsync(flowTodo); //发送短信 var user = await _userRepository.GetAsync(flowTodo.UserId); // Common.Sms.AliySms.FolwCheckSendSms(user.Phone); //Common.Sms.MasSms.SendSmsTemplate(new List() { user.Phone }, "c9bdae1685514a9b821299720e2c5fe8"); await smsService.SendSmsTemplate(new List() { user.Phone }, "c9bdae1685514a9b821299720e2c5fe8", flow.Id, AllTypeConst.Flow.GetHashCode()); } } } } private async Task TaskCarbonCopyAsync(IEnumerable 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); } } private async Task TaskApproverCheckAsync(IEnumerable 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> GetUserIdListAsync(List approverChecks) { var allUserIdList = new List(); 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> GetUserIdListAsync(IMultipleUser multipleUser) { if (multipleUser != null) { if (multipleUser.UserId > 0) { return new List { 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(); } } }