/// <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));
 }
Example #2
0
        /// <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);
         }
     }
 }
Example #6
0
        /// <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);
        }
Example #7
0
        /// <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);
        }
Example #9
0
        /// <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 }
                }
            });
        }
Example #10
0
        /// <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);
        }
Example #11
0
 /// <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);
 }
Example #12
0
        /// <summary>
        /// 得到工作流
        /// </summary>
        /// <returns></returns>
        public virtual WorkflowArgsEntity GetWorkflowArgs()
        {
            var workflowArgs = new WorkflowArgsEntity
            {
                Engine = GetWorkflowEngineEntity()
            };

            return(workflowArgs);
        }
Example #13
0
        /// <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);
        }
Example #14
0
        /// <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);
        }
Example #15
0
        /// <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);
        }
Example #16
0
        /// <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);
        }
Example #17
0
        /// <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);
        }
Example #18
0
 /// <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);
     }
 }
Example #19
0
        /// <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());
        }
Example #21
0
        /// <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);
        }
Example #22
0
        /// <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 }
            });
        }
Example #23
0
        /// <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);
        }
Example #24
0
        /// <summary>
        /// 发送消息
        /// </summary>
        /// <param name="args"></param>
        public virtual void SendMessage(WorkflowArgsEntity args)
        {
            Action <WorkflowArgsEntity> action = SendAsyncMessage;

            action.BeginInvoke(args, null, null);
        }