/// <summary> /// 验证 /// </summary> /// <returns></returns> protected virtual bool Validate(WorkflowArgsEntity args) { if (args.Task == null) { args.AddError("TaskNoExist"); return(false); } if (args.Flow == null) { args.AddError("FlowNoExist"); return(false); } if (args.Node == null) { args.AddError("NodeNoExist"); return(false); } if (args.Task.Status != TaskStatusType.Waiting) { args.AddError("TaskHandled"); return(false); } if (args.Task.Account == null || args.Task.Account.Id != args.AccountId) { args.AddError("NoAuthority"); return(false); } return(ValidateCreateTask(args)); }
/// <summary> /// 得到消息 /// </summary> /// <param name="args"></param> /// <returns></returns> protected virtual IList <MessageEntity> GetMessageEntities(WorkflowArgsEntity args) { if (string.IsNullOrWhiteSpace(args.Node.PassName)) { var user = GetSumbitAccount(args); var mess = GetMessageEntity(args, user, 0); if (mess == null) { return(null); } return(new List <MessageEntity> { mess }); } if (args.NextTasks == null) { return(null); } var infos = new List <MessageEntity>(); foreach (var nextTask in args.NextTasks) { infos.Add(GetMessageEntity(args, nextTask.Account, nextTask.Id)); } return(infos); }
/// <summary> /// 验证修改 /// </summary> /// <param name="args"></param> /// <returns></returns> public virtual IList <IUnitofwork> Handle(WorkflowArgsEntity args) { if (args == null) { return(null); } if (args.AccountId == 0 || args.TaskId == 0 || args.LevelId == 0) { args.AddError("ParamterError"); return(null); } FillArgs(args); if (!Validate(args)) { return(null); } args.Entity = args.Entity.Id == 0 ? args.Entity : GetEntityByConditions(args); var nodeIds = args.Flow.Nodes == null ? null : args.Flow.Nodes.Where(it => it.Name == args.Node.Name).Select(it => it.Id).ToArray(); if (nodeIds == null || nodeIds.Length == 0) { return(null); } var currentTasks = GetCurrentTasks(args.Entity.Id, nodeIds); args.CreateTasks(currentTasks); if (args.NextTasks == null) { return(null); } SetEntityStatus(args); return(Repository.Save(args.NextTasks)); }
/// <summary> /// 填充实体 /// </summary> protected virtual void FillArgs(WorkflowArgsEntity args) { if (args.TaskId > 0) { args.Task = Repository.Get <TaskEntity>(args.TaskId); return; } var auditors = args.Engine.GetAuditorsHandle(args.AccountId); if (auditors != null) { var node = args.Flow.Nodes.OrderByDescending(it => it.Sequence) .FirstOrDefault(it => it.Auditor != null && auditors.Contains(it.Auditor.Id)); if (node != null) { var name = node.NodeType == NodeType.Any || node.NodeType == NodeType.Any ? node.PassName : node.Name; args.Node = args.Flow.Nodes.FirstOrDefault(it => it.Name == name); } } else { args.Node = args.Flow.Nodes.FirstOrDefault(it => it.NodeType == NodeType.Start); } }
/// <summary> /// 设置业务状态 /// </summary> protected virtual void SetEntityStatus(WorkflowArgsEntity args) { if (args.NextNodes == null || args.NextNodes.Count == 0) { return; } foreach (var nextNode in args.NextNodes) { if (string.IsNullOrEmpty(nextNode.StatusName) || string.IsNullOrWhiteSpace(nextNode.StatusValue)) { continue; } Winner.Creator.Get <Winner.Base.IProperty>() .SetValue(args.Entity, nextNode.StatusName, nextNode.StatusValue); if (args.Entity.SaveType == SaveType.None) { args.Entity.SaveType = SaveType.Modify; args.Entity.SetProperty(nextNode.StatusName); } else if (args.Entity.SaveType == SaveType.Modify && args.Entity.Properties != null) { args.Entity.SetProperty(nextNode.StatusName); } } }
/// <summary> /// 得到添加Untiofwork /// </summary> /// <param name="args"></param> /// <returns></returns> public virtual IList <IUnitofwork> GetHandleUnitofworks(WorkflowArgsEntity args) { if (args == null) { return(null); } args.Engine = GetWorkflowEngineEntity(); var unitofworks = WorkflowDomainService.Handle(args); if (!args.IsValidate) { return(null); } unitofworks = unitofworks ?? new List <IUnitofwork>(); var domainService = DomainServices.ContainsKey(args.Flow.Id)? DomainServices[args.Flow.Id]:null; if (domainService != null) { var domainUnitofworks = domainService.Handle(args.Entity); if (domainUnitofworks == null) { args.Errors = args.Errors ?? new List <ErrorInfo>(); args.Errors.AddList(args.Entity.Errors); return(null); } unitofworks.AddList(domainUnitofworks); } unitofworks.AddList(MessageDomainService.GetUnitofworks(args)); return(unitofworks); }
/// <summary> /// 保存 /// </summary> /// <param name="isPass"></param> protected virtual void SaveWorkflowArgs(bool isPass) { var info = FillEntity(); if (info == null) { return; } var args = new WorkflowArgsEntity { Task = new TaskEntity { Consumer = (ITaskTab)info, Id = TaskId, Account = new AccountEntity { Id = AccountId }, Level = LevelDrowDownList == null ? "" : LevelDrowDownList.SelectedValue, Remark = RemarkControl == null ? "" : RemarkControl.Value } }; var rev = Ioc.Resolve <IWorkflowEngineApplicationService>().Handle(args); SetResult(rev, args.Errors); }
/// <summary> /// 得到流程 /// </summary> /// <param name="args"></param> /// <returns></returns> protected virtual bool ValidateCreateTask(WorkflowArgsEntity args) { if (args.Task != null) { return(true); } if (args.Task == null && args.Entity.SaveType == SaveType.Add) { return(true); } var query = new QueryInfo { IsReturnCount = false }; query.SetPageSize(1) .Query <TaskEntity>() .Where(it => it.DataId == args.Entity.Id && it.Flow.Id == args.Flow.Id) .Select(it => it.Id); var infos = Repository.GetEntities <TaskEntity>(query); if (infos != null && infos.Count > 0) { args.AddError("TaskAlreadCreated"); return(false); } return(true); }
/// <summary> /// 发送邮件 /// </summary> /// <param name="args"></param> /// <param name="message"></param> protected virtual void SendEmailMesssage(WorkflowArgsEntity args, MessageEntity message) { if ((args.Node.MessageType & (int)MessageType.Email) == 0 || string.IsNullOrWhiteSpace(args.Node.EmailMessage)) { return; } var account = Repository.Get <AccountEntity>(message.Account.Id); if (account == null || string.IsNullOrEmpty(account.Email)) { return; } var url = ConfigurationManager.GetSetting <string>(args.Flow.Url); url = string.Format("{0}{1}", string.IsNullOrWhiteSpace(url) ? args.Flow.Url : url, args.Flow.EmailUrl); var detail = args.Node.EmailMessage.Replace("【Remark】", args.Remark).Replace("【Url】", url); EmailRepository.Send(new EmailEntity { IsLog = true, Mail = new MailInfo { Subject = message.Title, Body = detail, ToMails = new[] { account.Email } } }); }
/// <summary> /// 处理工作流 /// </summary> /// <param name="args"></param> /// <returns></returns> public virtual bool Handle(WorkflowArgsEntity args) { if (args.Task == null) { return(false); } FillDataTask(args); FillCurrentOtherTasks(args); var entity = args.Task.Consumer as BaseEntity; if (entity == null) { return(false); } entity = entity.Id == 0 ? entity : GetEntityByConditions(args); args.Task.Consumer = entity as ITaskTab; var unitofworks = GetHandleUnitofworks(args); if (unitofworks == null) { return(false); } var rev = Winner.Creator.Get <IContext>().Commit(unitofworks); if (rev) { args.Task.SendMessage(); } return(rev); }
/// <summary> /// 填充任务 /// </summary> /// <param name="args"></param> protected virtual void FillDataTask(WorkflowArgsEntity args) { if (args.Task.SaveType == SaveType.Add) { return; } args.DataTask = Repository.Get <TaskEntity>(args.Task.Id); }
/// <summary> /// 得到工作流 /// </summary> /// <returns></returns> public virtual WorkflowArgsEntity GetWorkflowArgs() { var workflowArgs = new WorkflowArgsEntity { Engine = GetWorkflowEngineEntity() }; return(workflowArgs); }
/// <summary> /// 填充任务 /// </summary> /// <param name="args"></param> protected virtual void FillCurrentOtherTasks(WorkflowArgsEntity args) { if (args.DataTask == null) { return; } var query = new QueryInfo(); query.Query <TaskEntity>() .Where(it => it.Key == args.DataTask.Key && it.Status == TaskStatusType.Waiting) .Select(it => new object[] { it.Id, it.Status }); args.CurrentOtherTasks = Repository.GetEntities <TaskEntity>(query); }
/// <summary> /// 得到提交人 /// </summary> /// <param name="args"></param> /// <returns></returns> protected virtual AccountEntity GetSumbitAccount(WorkflowArgsEntity args) { var query = new QueryInfo { IsReturnCount = false }; query.SetPageSize(1) .Query <TaskEntity>() .Where(it => it.DataId == args.Task.DataId && it.Flow.Id == args.Flow.Id && it.Status == TaskStatusType.Created) .Select(it => it.Account.Id); var entities = Repository.GetEntities <TaskEntity>(query); return(entities?.FirstOrDefault()?.Account); }
/// <summary> /// 验证修改 /// </summary> /// <param name="args"></param> /// <returns></returns> public virtual IList <IUnitofwork> GetUnitofworks(WorkflowArgsEntity args) { if (args == null || args.Entity == null || args.Flow == null || args.Task == null || args.Node == null) { return(null); } var infos = GetMessageEntities(args); args.Messages = infos; if (infos != null && infos.Count > 0) { return(Handle(infos)); } return(null); }
/// <summary> /// 处理工作流 /// </summary> /// <param name="args"></param> /// <returns></returns> public virtual bool Handle(WorkflowArgsEntity args) { var unitofworks = GetHandleUnitofworks(args); if (unitofworks == null) { return(false); } var rev = Winner.Creator.Get <IContext>().Commit(unitofworks); if (rev) { SendMessage(args); return(true); } return(false); }
/// <summary> /// 发送系统消息 /// </summary> /// <param name="args"></param> /// <param name="message"></param> protected virtual void SendDefaultMesssage(WorkflowArgsEntity args, MessageEntity message) { if ((args.Node.MessageType & (int)MessageType.Default) == 0 || string.IsNullOrWhiteSpace(args.Node.DefaultMessage)) { return; } var url = ConfigurationManager.GetSetting <string>(args.Flow.Url); url = string.Format("{0}{1}?taskid={2}", string.IsNullOrWhiteSpace(url) ? args.Flow.Url : url, args.Flow.DefaultUrl, message.Task?.Id); var detail = args.Node.DefaultMessage.Replace("【Remark】", args.Remark).Replace("【Url】", url); var name = string.Format(MessageFlag, message.Account.Id); QueueRepository.Open(name, 20); QueueRepository.Push(name, detail); }
/// <summary> /// 异步发送消息 /// </summary> /// <param name="args"></param> public virtual void SendAsyncMessage(WorkflowArgsEntity args) { if (args.Messages == null) { return; } foreach (var message in args.Messages) { if (message.Account == null) { continue; } SendDefaultMesssage(args, message); SendEmailMesssage(args, message); SendMobileMesssage(args, message); } }
/// <summary> /// 保存 /// </summary> /// <param name="isPass"></param> protected virtual void SaveWorkflowArgs(bool isPass) { var info = FillEntity(); if (info == null) { return; } var args = new WorkflowArgsEntity { Entity = info, TaskId = TaskId, AccountId = AccountId, IsPass = isPass, LevelId = LevelDrowDownList == null ? 0 : LevelDrowDownList.SelectedValue.Convert <long>(), Remark = RemarkControl == null ? "" : RemarkControl.Value }; var rev = Ioc.Resolve <IWorkflowEngineApplicationService>().Handle(args); SetResult(rev, args.Errors); }
/// <summary> /// 得到对象 /// </summary> /// <param name="args"></param> /// <returns></returns> protected virtual BaseEntity GetEntityByConditions(WorkflowArgsEntity args) { var query = new QueryInfo(); var select = new StringBuilder(); select.Append("*"); if (args.Node.Conditions != null) { foreach (var condition in args.Node.Conditions.Where(condition => condition.SelectExpArray != null)) { @select.Append(","); @select.Append(condition.SelectExp); } } var entityName = string.Format("{0},{1}", args.Entity.GetType().FullName, args.Entity.GetType().Module.ToString().Replace(".dll", "")); query.Select(select.ToString()).Where("Id==@Id").From(entityName) .SetParameter("Id", args.Entity.Id); return(Repository.GetEntities <BaseEntity>(query).FirstOrDefault()); }
/// <summary> /// 得到消息 /// </summary> /// <param name="args"></param> /// <param name="account"></param> /// <param name="taskId"></param> /// <returns></returns> protected virtual MessageEntity GetMessageEntity(WorkflowArgsEntity args, AccountEntity account, long taskId) { if (account == null) { return(null); } var message = new MessageEntity { SaveType = SaveType.Add, Flow = args.Flow, Title = args.Node.MessageTitle, Data = args.Entity, IsRead = false, Level = args.Level, Task = new TaskEntity { Id = taskId }, Account = account }; return(message); }
/// <summary> /// 发送手机号码 /// </summary> /// <param name="args"></param> /// <param name="message"></param> protected virtual void SendMobileMesssage(WorkflowArgsEntity args, MessageEntity message) { if ((args.Node.MessageType & (int)MessageType.Email) == 0 || string.IsNullOrWhiteSpace(args.Node.MobileMessage)) { return; } var account = Repository.Get <AccountEntity>(message.Account.Id); if (account == null || string.IsNullOrEmpty(account.Mobile)) { return; } var url = ConfigurationManager.GetSetting <string>(args.Flow.Url); url = string.Format("{0}{1}", string.IsNullOrWhiteSpace(url) ? args.Flow.Url : url, args.Flow.MobileUrl); url = SignUrl(message, url); var detail = args.Node.MobileMessage.Replace("【Remark】", args.Remark).Replace("【Url】", url); MobileRepository.Send(new MobileEntity { Body = detail, ToMobiles = new[] { account.Mobile } }); }
/// <summary> /// 得到添加Untiofwork /// </summary> /// <param name="args"></param> /// <returns></returns> public virtual IList <IUnitofwork> GetHandleUnitofworks(WorkflowArgsEntity args) { if (args == null) { return(null); } args.Engine = GetWorkflowEngineEntity(); var domainService = DomainServices.ContainsKey(args.Flow.Id) ? DomainServices[args.Flow.Id] : null; if (domainService == null) { return(null); } var entity = args.Task.Consumer as BaseEntity; var unitofworks = domainService.Handle(entity); if (unitofworks == null) { args.Errors = args.Errors ?? new List <ErrorInfo>(); args.Errors.AddList(entity.Errors); return(null); } return(unitofworks); }
/// <summary> /// 发送消息 /// </summary> /// <param name="args"></param> public virtual void SendMessage(WorkflowArgsEntity args) { Action <WorkflowArgsEntity> action = SendAsyncMessage; action.BeginInvoke(args, null, null); }