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.EnumConst; namespace GxPress.Service.Implement { public partial class FlowService { /// /// 添加工作流 /// /// /// public async Task AddAsync(FlowDto flow) { flow.Id = await _flowRepository.InsertAsync(new Flow { State = FlowState.Checking, ProcessId = flow.ProcessId, UserId = flow.UserId, IsRead = false }); foreach (var flowField in flow.Fields) { await _flowFieldValueRepository.InsertAsync(new FlowFieldValue { ProcessId = flow.ProcessId, FlowId = flow.Id, FieldId = flowField.Id, UserId = flow.UserId, FieldType = flowField.Type, StringValue = flowField.Value, StringValues = flowField.Value, IntValue = StringUtils.ToInt(flowField.Value) }); } //添加审核人 if (flow.ApproverCheckUserIds != null) { for (int i = 0; i < flow.ApproverCheckUserIds.Count(); i++) { var todo = new FlowTodo { ProcessId = flow.ProcessId, FlowId = flow.Id, UserId = flow.ApproverCheckUserIds[i], Type = nameof(TodoTypeConst.ApproverCheck), IsDone = false, IsOperate = i == 0, }; await _flowTodoRepository.InsertAsync(todo); if (i == 0) { //发送短信 var user = await _userRepository.GetAsync(todo.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()); } } } if (flow.CarbonCopyUserIds != null) { foreach (var userId in flow.CarbonCopyUserIds) { var todo = new FlowTodo { ProcessId = flow.ProcessId, FlowId = flow.Id, UserId = userId, Type = nameof(TodoTypeConst.CarbonCopy), IsDone = false, IsOperate = false }; await _flowTodoRepository.InsertAsync(todo); } } var nodes = await _processService.GetAllAsync(flow.ProcessId); foreach (var processNodeDto in nodes.Where(n => n.ParentId == 0)) { if (processNodeDto.Type == nameof(ProcessNodeTypeConst.Start)) { await NodeExecuteAsync(flow, processNodeDto); } //插入审核人 if (processNodeDto.Type == nameof(ProcessNodeTypeConst.Approver) && processNodeDto.ParentId == 0) { await NodeExecuteAsync(flow, processNodeDto); //break; } if (processNodeDto.Type == nameof(ProcessNodeTypeConst.Switch)) { //工作流条件 await NodeExecuteSwitchAsync(flow, processNodeDto); } if (processNodeDto.Type == nameof(ProcessNodeTypeConst.End)) { await NodeExecuteAsync(flow, processNodeDto); break; } } //创建工作流 foreach (var item in flow.flowAttachments) { item.FlowId = flow.Id; item.TypeId = 1; } await flowAttachmentRepository.InsertsAsync(flow.flowAttachments); return flow.Id; } public async Task ReAddAsync(int flowId) { var flow = await GetAsync(flowId); if (flow == null) return 0; flow.Id = await _flowRepository.InsertAsync(new Flow { ProcessId = flow.ProcessId, State = FlowState.Checking, UserId = flow.UserId }); //获取上一个的文件 var flowAttachments = (await flowAttachmentRepository.GetAllAsync(flowId)).ToList(); foreach (var item in flowAttachments) { item.FlowId = flow.Id; item.TypeId = 1; } await flowAttachmentRepository.InsertsAsync(flowAttachments); if (flow.Fields != null) { foreach (var flowField in flow.Fields) { await _flowFieldValueRepository.InsertAsync(new FlowFieldValue { ProcessId = flow.ProcessId, FlowId = flow.Id, FieldId = flowField.Id, UserId = flow.UserId, FieldType = flowField.Type, StringValue = flowField.Value, StringValues = flowField.Value, IntValue = StringUtils.ToInt(flowField.Value) }); } } for (int i = 0; i < flow.ApproverCheckUserIds.Count(); i++) { var todo = new FlowTodo { ProcessId = flow.ProcessId, FlowId = flow.Id, UserId = flow.ApproverCheckUserIds[i], Type = nameof(TodoTypeConst.ApproverCheck), IsDone = false, IsOperate = i == 0, }; await _flowTodoRepository.InsertAsync(todo); } if (flow.ApproverCheckUserIds != null) { foreach (var userId in flow.ApproverCheckUserIds) { var todo = new FlowTodo { ProcessId = flow.ProcessId, FlowId = flow.Id, UserId = userId, Type = nameof(TodoTypeConst.CarbonCopy), IsDone = false }; await _flowTodoRepository.InsertAsync(todo); } } var nodes = await GetNodesAsync(flow, await _processService.GetNodesAsync(flow.ProcessId, 0)); if (nodes != null) { foreach (var processNodeDto in nodes) { if (processNodeDto.Type == nameof(ProcessNodeTypeConst.Start) || processNodeDto.Type == nameof(ProcessNodeTypeConst.End)) { await NodeExecuteAsync(flow, processNodeDto); } else if (processNodeDto.Type == nameof(ProcessNodeTypeConst.Approver)) { await NodeExecuteAsync(flow, processNodeDto); } } } await DeleteAsync(flow.Id); return flow.Id; } /// /// 上会待定 /// /// /// /// public async Task ActionsWait(int flowId, int userId) { var flowTode = await _flowTodoRepository.GetAsync(flowId); if (flowTode == null) return false; flowTode.IsDone = true; flowTode.DoneType = 2; flowTode.IsChecked = false; return await _flowTodoRepository.UpdateAsync(flowTode); } } }