Esempio n. 1
0
 /// <summary>
 /// 流程出现异常(终止、暂停、撤销)后,发送消息
 /// </summary>
 /// <param name="process"></param>
 public void SendMessageWhenProcessExcept(WfProcessInstance processIns)
 {
     string messageSetting = processIns.MessageSetting;
     bool sendSuspent = false;
     bool sendMail = false;
     bool sendMessage = false;
     if (messageSetting.IsPresent())
     {
         var jmset = JObject.Parse(messageSetting);
         sendSuspent = jmset.GetValue("suspend").ToBool();
         sendMail = jmset.GetValue("mail").ToBool();
         sendMessage = jmset.GetValue("message").ToBool();
     }
     if (!sendSuspent || processIns.AppEmpUid.IsMissing())
     {
         return;
     }
     Employee employee = _dataAccessor.Get<Employee>(processIns.AppEmpUid);
     if(employee==null)
     {
         return;
     }
     string title = $"您发起的单号为:{processIns.BizName}的\"{processIns.ProcessName}\"流程被挂起";
     string content = $"您发起的流程【{processIns.ProcessName}】,单号:{processIns.BizName},已经被挂起,请知晓!";
     if (sendMail)
     {
         SendMailToAssignee(title, employee.EmpName, $"{employee.EmpName}<{employee.Mailbox}>", content);
     }
     if(sendMessage)
     {
         SendInmsgToAssignee(employee.Fid, title);
     }
 }
Esempio n. 2
0
        internal WfProcessInstance Insert(WfProcessInstance wfProcessInstance)
        {
            long id = _dataAccessor.Insert <WfProcessInstance>(wfProcessInstance);

            wfProcessInstance.Id = id;
            return(wfProcessInstance);
        }
Esempio n. 3
0
        /// <summary>
        /// 更新单据表(发起时)
        /// </summary>
        /// <param name="billTableName"></param>
        /// <param name="billId"></param>
        internal void UpdateBillDataWhenStartup(string billTableName, string billId)
        {
            FapTable table = DbSession.QueryFirstOrDefault <FapTable>($"select * from FapTable where TableName='{billTableName}'");

            if (table == null || string.IsNullOrWhiteSpace(table.TableFeature))
            {
                return;
            }

            if (("," + table.TableFeature + ",").IndexOf(",BillFeature,") >= 0)
            {
                //单据数据
                dynamic billData = DbSession.Get(billTableName, billId);
                if (billData == null)
                {
                    return;
                }
                WfProcessInstance process    = DbSession.Get <WfProcessInstance>(ProcessId);
                DynamicParameters parameters = new DynamicParameters();
                parameters.Add("ProcessId", ProcessId);
                IEnumerable <WfTask> tasks = DbSession.QueryWhere <WfTask>("ProcessId=@ProcessId", parameters);
                if (tasks != null && tasks.Count() > 0)
                {
                    billData.CurrApprover = tasks.First().ExecutorEmpUid;
                }
                //更新单据的字段数据
                billData.SubmitTime = PublicUtils.GetSysDateTimeStr();
                billData.BillStatus = BillStatus.PROCESSING;

                DbSession.UpdateDynamicData(billData);
            }
        }
Esempio n. 4
0
        public GatewayExecutedResult CompleteAutomaticlly(WfProcessInstance processInstance,
                                                          string transitionGUID,
                                                          WfActivityInstance fromActivityInstance)
        {
            var gatewayActivityInstance = base.CreateActivityInstanceObject(base.GatewayActivity, processInstance);

            gatewayActivityInstance.DirectionType = GatewayDirectionEnum.OrSplit.ToString();

            base.InsertActivityInstance(gatewayActivityInstance);

            base.CompleteActivityInstance(gatewayActivityInstance.Fid);

            gatewayActivityInstance.ActivityState = ActivityStateEnum.Completed.ToString();
            base.GatewayActivityInstance          = gatewayActivityInstance;

            //写节点转移实例数据
            base.InsertTransitionInstance(processInstance,
                                          transitionGUID,
                                          fromActivityInstance,
                                          gatewayActivityInstance,
                                          TransitionTypeEnum.Forward,
                                          TransitionFlyingTypeEnum.NotFlying);

            GatewayExecutedResult result = GatewayExecutedResult.CreateGatewayExecutedResult(GatewayExecutedStatus.Successed);

            return(result);
        }
Esempio n. 5
0
        private async Task SendProgress(string nextStepId,
                                        string assignToUserIds,
                                        string assignToUserNames,
                                        JsonModel jsonModel,
                                        WfProcessInstance processInstance,
                                        WfProcess process,
                                        WfActivityInstance currActIns)
        {
            var nextAct = process.GetActivity(nextStepId);

            if (nextAct == null)
            {
                jsonModel.statusCode = 300;
                jsonModel.message    = $"流程 {process.Name}的节点 {nextStepId} 找不到!";
                return;
            }

            var nextActInstance = CreateActivityInstance(process,
                                                         processInstance,
                                                         nextAct,
                                                         WfActivityState.Running,
                                                         assignToUserIds,
                                                         assignToUserNames);

            nextActInstance.PreActInstanceId = currActIns.Id;
            processInstance.CurrActivityName = nextActInstance.ActivityName;
            await WfActivityInstanceRepository.SaveAsync(nextActInstance);
        }
Esempio n. 6
0
        /// <summary>
        /// 实现回写
        /// </summary>
        public override void WriteBackToBusiness()
        {
            DynamicParameters parameters = new DynamicParameters();

            parameters.Add("ProcessId", ProcessId);
            WfFormInstance form = DbSession.QueryFirstOrDefaultWhere <WfFormInstance>("ProcessId=@ProcessId", parameters);

            if (form == null)
            {
                return;
            }

            //回写到业务表
            bool result = _config.ExecBillWriteBack(form.AppInstanceTableName, form.AppInstanceId, DbSession);

            if (result)
            {
                //设置流程实例的回写状态
                WfProcessInstance process = this.DbSession.Get <WfProcessInstance>(this.ProcessId);
                if (process != null)
                {
                    process.WriteBackState = 1;
                    process.WriteBackTime  = PublicUtils.CurrentDateTimeStr;
                    this.DbSession.Update <WfProcessInstance>(process);
                }
            }
        }
Esempio n. 7
0
        internal WfTransitionInstance CreateTransitionInstanceObject(WfProcessInstance processInstance,
                                                                     string transitionId,
                                                                     WfActivityInstance fromActivityInstance,
                                                                     WfActivityInstance toActivityInstance,
                                                                     TransitionTypeEnum transitionType,
                                                                     TransitionFlyingTypeEnum flyingType,
                                                                     WfAppRunner runner,
                                                                     int conditionParseResult)
        {
            var entity = new WfTransitionInstance();

            entity.Fid              = UUIDUtils.Fid;
            entity.ProcessUid       = processInstance.ProcessUid;
            entity.ProcessInsUid    = processInstance.Fid;
            entity.TransitionNodeId = transitionId;
            entity.TransitionType   = transitionType.ToString();// WfTransitionInstanceType.Forward;
            entity.JumpType         = (int)flyingType;

            //构造活动节点数据
            entity.SourceActivityInsUid   = fromActivityInstance.Fid;
            entity.SourceActivityNodeId   = fromActivityInstance.NodeId;
            entity.SourceActivityNodeType = fromActivityInstance.ActivityType;
            entity.SourceActivityNodeName = fromActivityInstance.ActivityName;
            entity.TargetActivityInsUid   = toActivityInstance.Fid;
            entity.TargetActivityNodeId   = toActivityInstance.NodeId;
            entity.TargetActivityNodeType = toActivityInstance.ActivityType;
            entity.TargetActivityNodeName = toActivityInstance.ActivityName;

            entity.WalkState = conditionParseResult;
            //entity.CreatedByUserID = runner.UserID;
            //entity.CreatedByUserName = runner.UserName;
            //entity.CreatedDateTime = System.DateTime.Now;

            return(entity);
        }
Esempio n. 8
0
        public void RecordWhenCompleteProcess(string processId, string taskId, string suggestion)
        {
            WfProcessInstance process = _dataAccessor.Get <WfProcessInstance>(processId, false);

            this.Insert(WorkflowConstants.constant_complete,
                        processId, taskId, process.ApproveResult, suggestion);
        }
Esempio n. 9
0
        /// <summary>
        /// 创建活动任务转移实例数据
        /// </summary>
        /// <param name="toActivity">活动</param>
        /// <param name="processInstance">流程实例</param>
        /// <param name="fromActivityInstance">开始活动实例</param>
        /// <param name="transitionGUID">转移GUID</param>
        /// <param name="transitionType">转移类型</param>
        /// <param name="flyingType">跳跃类型</param>
        /// <param name="activityResource">活动资源</param>
        /// <param name="session">会话</param>
        internal override void CreateActivityTaskTransitionInstance(ActivityEntity toActivity,
                                                                    WfProcessInstance processInstance,
                                                                    WfActivityInstance fromActivityInstance,
                                                                    string transitionGUID,
                                                                    TransitionTypeEnum transitionType,
                                                                    TransitionFlyingTypeEnum flyingType)
        {
            //实例化Activity
            var toActivityInstance = base.CreateActivityInstanceObject(toActivity, processInstance, AppRunner);

            //进入运行状态
            toActivityInstance.ActivityState       = ActivityStateEnum.Ready.ToString();
            toActivityInstance.AssignedToUserIds   = GenerateActivityAssignedUserIDs(toActivity.Performers);
            toActivityInstance.AssignedToUserNames = GenerateActivityAssignedUserNames(toActivity.Performers);

            //插入活动实例数据
            base.ActivityInstanceManager.Insert(toActivityInstance);

            //插入任务数据
            base.CreateNewTask(toActivityInstance, toActivity);

            //插入转移数据
            InsertTransitionInstance(processInstance,
                                     transitionGUID,
                                     fromActivityInstance,
                                     toActivityInstance,
                                     transitionType,
                                     flyingType,
                                     AppRunner);
        }
Esempio n. 10
0
        /// <summary>
        /// OrJoin合并时的节点完成方法
        /// 1. 如果有满足条件的OrJoin前驱转移,则会重新生成新的OrJoin节点实例
        /// </summary>
        /// <param name="processInstance">流程实例</param>
        /// <param name="transitionGUID">转移GUID</param>
        /// <param name="fromActivityInstance">起始活动实例</param>
        /// <param name="activityResource">活动资源</param>
        /// <param name="session">会话</param>
        public GatewayExecutedResult CompleteAutomaticlly(WfProcessInstance processInstance,
                                                          string transitionGUID,
                                                          WfActivityInstance fromActivityInstance)
        {
            //检查是否有运行中的合并节点实例
            WfActivityInstance joinNode = base.ActivityInstanceManager.GetActivityInstanceRunning(
                processInstance.Fid,
                base.GatewayActivity.ActivityID);

            int tokensRequired = 0;
            int tokensHad      = 0;

            if (joinNode == null)
            {
                var joinActivityInstance = base.CreateActivityInstanceObject(base.GatewayActivity, processInstance);

                //计算总需要的Token数目
                joinActivityInstance.TokensRequired = GetTokensRequired(processInstance.Fid);
                joinActivityInstance.TokensHad      = 1;
                tokensRequired = joinActivityInstance.TokensRequired;

                //进入运行状态
                joinActivityInstance.ActivityState = ActivityStateEnum.Running.ToString();
                //joinActivityInstance.DirectionType =GatewayDirectionEnum.AndJoin.ToString();

                base.InsertActivityInstance(joinActivityInstance);
                base.InsertTransitionInstance(processInstance,
                                              transitionGUID,
                                              fromActivityInstance,
                                              joinActivityInstance,
                                              TransitionTypeEnum.Forward,
                                              TransitionFlyingTypeEnum.NotFlying);
            }
            else
            {
                //更新节点的活动实例属性
                base.GatewayActivityInstance = joinNode;
                tokensRequired = base.GatewayActivityInstance.TokensRequired;
                tokensHad      = base.GatewayActivityInstance.TokensHad;
                //更新Token数目
                base.ActivityInstanceManager.IncreaseTokensHad(base.GatewayActivityInstance.Fid, base._runner);
                base.InsertTransitionInstance(processInstance,
                                              transitionGUID,
                                              fromActivityInstance,
                                              joinNode,
                                              TransitionTypeEnum.Forward,
                                              TransitionFlyingTypeEnum.NotFlying);
            }
            if ((tokensHad + 1) == tokensRequired)
            {
                //如果达到完成节点的Token数,则设置该节点状态为完成
                base.CompleteActivityInstance(base.GatewayActivityInstance.Fid);
                base.GatewayActivityInstance.ActivityState = ActivityStateEnum.Completed.ToString();
            }

            GatewayExecutedResult result = GatewayExecutedResult.CreateGatewayExecutedResult(GatewayExecutedStatus.Successed);

            return(result);
        }
Esempio n. 11
0
        /// <summary>
        /// 根据任务ID,获取流程实例
        /// </summary>
        /// <param name="taskUid"></param>
        /// <returns></returns>
        internal WfProcessInstance GetByTaskId(string taskUid)
        {
            WfTask wtsk = _dataAccessor.Get <WfTask>(taskUid, false);

            WfProcessInstance processInstance = _dataAccessor.Get <WfProcessInstance>(wtsk.ProcessInsUid, false);

            return(processInstance);
        }
Esempio n. 12
0
 /// <summary>
 /// 开始节点的构造执行上下文对象
 /// </summary>
 /// <param name="processModel"></param>
 /// <param name="processInstance"></param>
 /// <param name="activity"></param>
 /// <param name="activityResource"></param>
 private ActivityForwardContext(IProcessModel processModel,
                                WfProcessInstance processInstance,
                                ActivityEntity activity)
 {
     ProcessModel    = processModel;
     ProcessInstance = processInstance;
     Activity        = activity;
 }
Esempio n. 13
0
 /// <summary>
 /// 创建工作项及转移数据
 /// </summary>
 /// <param name="toActivity">活动</param>
 /// <param name="processInstance">流程实例</param>
 /// <param name="fromActivityInstance">起始活动实例</param>
 /// <param name="transitionGUID">转移GUID</param>
 /// <param name="transitionType">转移类型</param>
 /// <param name="flyingType">跳跃类型</param>
 /// <param name="activityResource">活动资源</param>
 /// <param name="session">Session</param>
 internal virtual void CreateActivityTaskTransitionInstance(ActivityEntity toActivity,
                                                            WfProcessInstance processInstance,
                                                            WfActivityInstance fromActivityInstance,
                                                            String transitionGUID,
                                                            TransitionTypeEnum transitionType,
                                                            TransitionFlyingTypeEnum flyingType
                                                            )
 {
 }
Esempio n. 14
0
        public void RecordWhenCreateTask(string processId, string taskId, string suggestion)
        {
            string            userId   = _applicationContext.EmpUid;
            string            userName = _applicationContext.EmpName;
            WfProcessInstance process  = _dataAccessor.Get <WfProcessInstance>(processId, false);

            this.Insert(WorkflowConstants.constant_create, userId, userName,
                        processId, taskId, process.ApproveResult, suggestion);
        }
        public static WfRuntimeManager CreateRuntimeInstanceStartup(WfAppRunner runner, IServiceProvider serviceProvider,
                                                                    WfProcessInstance parentProcessInstance,
                                                                    SubProcessNode subProcessNode,
                                                                    ref WfExecutedResult result)
        {
            //检查流程是否可以被启动
            var rmins = new WfRuntimeManagerStartup(serviceProvider);

            rmins.WfExecutedResult = result = new WfExecutedResult();
            var pim = new ProcessInstanceManager(serviceProvider);
            WfProcessInstance processInstance = null;

            if (subProcessNode == null)
            {
                //正常流程启动
                processInstance = pim.GetProcessInstanceLatest(
                    runner.ProcessUid,
                    runner.BillUid);
            }
            else
            {
                //子流程启动
                processInstance = pim.GetProcessInstanceLatest(
                    subProcessNode.SubProcessId, runner.BillUid);
            }

            //不能同时启动多个主流程
            if (processInstance != null &&
                processInstance.ParentProcessInsUid == null &&
                processInstance.ProcessState == WfProcessInstanceState.Running)
            {
                result.Status        = WfExecutedStatus.Exception;
                result.ExceptionType = WfExceptionType.Started_IsRunningAlready;
                result.Message       = "流程已经处于运行状态,不要重复提交!";
            }
            else
            {
                //processInstance 为空,此时继续执行启动操作
                rmins.AppRunner             = runner;
                rmins.ParentProcessInstance = parentProcessInstance;
                rmins.InvokedSubProcessNode = subProcessNode;

                //获取流程第一个可办理节点
                rmins.ProcessModel = new ProcessModel(serviceProvider, runner.ProcessUid, runner.BillUid);
            }

            //var firstActivity = rmins.ProcessModel.GetFirstActivity();

            //rmins.AppRunner.NextActivityPerformers = ActivityResource.CreateNextActivityPerformers(firstActivity.ActivityID,
            //    runner.UserId,
            //    runner.UserName);


            return(rmins);
        }
Esempio n. 16
0
        /// <summary>
        /// 创建节点对象
        /// </summary>
        /// <param name="activity">活动</param>
        /// <param name="processInstance">流程实例</param>
        /// <param name="runner">运行者</param>
        protected WfActivityInstance CreateActivityInstanceObject(ActivityEntity activity,
                                                                  WfProcessInstance processInstance)
        {
            ActivityInstanceManager aim = new ActivityInstanceManager(_dataAccessor, _loggerFactory);

            this.GatewayActivityInstance = aim.CreateActivityInstanceObject(processInstance,
                                                                            activity,
                                                                            _runner);

            return(this.GatewayActivityInstance);
        }
Esempio n. 17
0
        /// <summary>
        /// 任务执行的上下文对象
        /// </summary>
        /// <param name="task"></param>
        /// <param name="processModel"></param>
        /// <param name="activityResource"></param>
        private ActivityForwardContext(WfTask task,
                                       IProcessModel processModel, WfProcessInstance processInstance, WfActivityInstance fromActivityInstance)
        {
            this.TaskView = task;

            //check task condition has load activity instance
            this.FromActivityInstance = fromActivityInstance;
            this.ProcessInstance      = processInstance;
            this.Activity             = processModel.GetActivity(task.NodeId);
            this.ProcessModel         = processModel;
        }
Esempio n. 18
0
        private async Task CompleteProcess(WfProcessInstance processInstance)
        {
            processInstance.ProcessState     = WfProcessState.Completed;
            processInstance.CurrActivityName = "结束";

            //TODO:更新数据源的状态
            var src = await GetSourceAsync(processInstance.TableSource, processInstance.SourceId);

            src.CommonStatus = CommonStatus.Enabled;
            await WfProcessInstanceRepository.SaveAsync(processInstance);
        }
Esempio n. 19
0
        /// <summary>
        /// 创建节点对象
        /// </summary>
        /// <param name="processInstance">流程实例</param>
        /// <param name="activity">活动</param>
        /// <param name="runner">执行者</param>
        protected WfActivityInstance CreateActivityInstanceObject(ActivityEntity activity,
                                                                  WfProcessInstance processInstance,
                                                                  WfAppRunner runner)
        {
            WfActivityInstance entity = ActivityInstanceManager.CreateActivityInstanceObject(
                processInstance,
                activity,
                runner);

            return(entity);
        }
Esempio n. 20
0
        private void WriteBackBill(WfTask task)
        {
            //回写单据审批人
            string            processInsUid = task.ProcessInsUid;
            WfProcessInstance process       = _dataAccessor.Get <WfProcessInstance>(processInsUid, false);
            string            billTable     = process.BillTable;
            string            billUid       = process.BillUid;
            string            sql           = $"update {billTable} set CurrApprover='{ task.ExecutorEmpUid}',ApprovalTime='{task.ExecuteTime}',ApprovalComments='{task.Suggestion}' where Fid='{billUid}' ";

            _dataAccessor.Execute(sql, null);
        }
Esempio n. 21
0
        /// <summary>
        /// 创建节点对象
        /// </summary>
        /// <param name="activity">活动</param>
        /// <param name="processInstance">流程实例</param>
        /// <param name="runner">运行者</param>
        protected WfActivityInstance CreateActivityInstanceObject(ActivityEntity activity,
                                                                  WfProcessInstance processInstance)
        {
            ActivityInstanceManager aim = new ActivityInstanceManager(_serviceProvider);

            this.GatewayActivityInstance = aim.CreateActivityInstanceObject(processInstance,
                                                                            activity,
                                                                            _runner);

            return(this.GatewayActivityInstance);
        }
Esempio n. 22
0
        public GatewayExecutedResult CompleteAutomaticlly(WfProcessInstance processInstance,
                                                          string transitionGUID,
                                                          WfActivityInstance fromActivityInstance)
        {
            GatewayExecutedResult result = GatewayExecutedResult.CreateGatewayExecutedResult(GatewayExecutedStatus.Unknown);

            bool canRenewInstance = false;

            //检查是否有运行中的合并节点实例
            WfActivityInstance joinNode = base.ActivityInstanceManager.GetActivityInstanceRunning(
                processInstance.Fid,
                base.GatewayActivity.ActivityID);

            if (joinNode == null)
            {
                canRenewInstance = true;
            }
            else
            {
                //判断是否可以激活下一步节点
                canRenewInstance = (joinNode.CanRenewInstance == 1);
                if (!canRenewInstance)
                {
                    result = GatewayExecutedResult.CreateGatewayExecutedResult(GatewayExecutedStatus.FallBehindOfXOrJoin);
                    return(result);
                }
            }

            if (canRenewInstance)
            {
                var gatewayActivityInstance = base.CreateActivityInstanceObject(base.GatewayActivity, processInstance);

                gatewayActivityInstance.DirectionType = GatewayDirectionEnum.XOrJoin.ToString();

                base.InsertActivityInstance(gatewayActivityInstance);

                base.CompleteActivityInstance(gatewayActivityInstance.Fid);

                gatewayActivityInstance.ActivityState = ActivityStateEnum.Completed.ToString();
                base.GatewayActivityInstance          = gatewayActivityInstance;

                //写节点转移实例数据
                base.InsertTransitionInstance(processInstance,
                                              transitionGUID,
                                              fromActivityInstance,
                                              gatewayActivityInstance,
                                              TransitionTypeEnum.Forward,
                                              TransitionFlyingTypeEnum.NotFlying);

                result = GatewayExecutedResult.CreateGatewayExecutedResult(GatewayExecutedStatus.Successed);
            }
            return(result);
        }
Esempio n. 23
0
        /// <summary>
        /// 创建活动任务转移数据
        /// </summary>
        /// <param name="toActivity">目的活动</param>
        /// <param name="processInstance">流程实例</param>
        /// <param name="fromActivityInstance">来源活动实例</param>
        /// <param name="transitionGUID">转移GUID</param>
        /// <param name="transitionType">转移类型</param>
        /// <param name="flyingType">飞跃类型</param>
        /// <param name="activityResource">活动资源</param>
        /// <param name="session">会话</param>
        internal override void CreateActivityTaskTransitionInstance(ActivityEntity toActivity,
                                                                    WfProcessInstance processInstance,
                                                                    WfActivityInstance fromActivityInstance,
                                                                    string transitionGUID,
                                                                    TransitionTypeEnum transitionType,
                                                                    TransitionFlyingTypeEnum flyingType)
        {
            //实例化Activity
            var toActivityInstance = CreateActivityInstanceObject(toActivity, processInstance, AppRunner);

            //进入运行状态
            toActivityInstance.ActivityState     = ActivityStateEnum.Ready.ToString();
            toActivityInstance.AssignedToUserIds = GenerateActivityAssignedUserIDs(
                toActivity.Performers);
            toActivityInstance.AssignedToUserNames = GenerateActivityAssignedUserNames(
                toActivity.Performers);

            //插入活动实例数据
            base.ActivityInstanceManager.Insert(toActivityInstance);

            //插入任务数据
            base.CreateNewTask(toActivityInstance, toActivity);

            //插入转移数据
            InsertTransitionInstance(processInstance,
                                     transitionGUID,
                                     fromActivityInstance,
                                     toActivityInstance,
                                     transitionType,
                                     flyingType, AppRunner);

            //启动子流程
            WfExecutedResult startedResult = null;
            var subProcessNode             = (SubProcessNode)toActivity.Node;

            subProcessNode.ActivityInstance = fromActivityInstance;
            WfAppRunner subRunner = CopyActivityForwardRunner(AppRunner,
                                                              new Performer()
            {
                UserId   = AppRunner.UserId,
                UserName =
                    AppRunner.UserName
            }, subProcessNode);

            var runtimeInstance = WfRuntimeManagerFactory.CreateRuntimeInstanceStartup(subRunner, _serviceProvider,
                                                                                       processInstance,
                                                                                       subProcessNode,
                                                                                       ref startedResult);

            runtimeInstance.OnWfProcessExecuted += runtimeInstance_OnWfProcessStarted;
            runtimeInstance.Execute();
        }
Esempio n. 24
0
 private WfActivityInstance CreateActivityInstance(WfProcess process,
                                                   WfProcessInstance processInstance,
                                                   WfActivity activity,
                                                   WfActivityState state,
                                                   long assignToUserId,
                                                   string assignToUserName)
 {
     return(CreateActivityInstance(process,
                                   processInstance,
                                   activity,
                                   state,
                                   $"[{assignToUserId}]",
                                   assignToUserName));
 }
Esempio n. 25
0
        /// <summary>
        /// 创建退回类型的活动实例对象
        /// </summary>
        /// <param name="processInstance">流程实例</param>
        /// <param name="backwardType">退回类型</param>
        /// <param name="backSrcActivityInstanceID">退回的活动实例ID</param>
        /// <param name="runner">登录用户</param>
        /// <returns></returns>
        protected WfActivityInstance CreateBackwardToActivityInstanceObject(WfProcessInstance processInstance, WfActivityInstance activityInstance,
                                                                            BackwardTypeEnum backwardType,
                                                                            string backSrcActivityInstanceID,
                                                                            WfAppRunner runner)
        {
            WfActivityInstance entity = ActivityInstanceManager.CreateBackwardActivityInstanceObject(
                processInstance,
                this.BackwardContext.BackwardToTaskActivity,
                activityInstance,
                backwardType,
                this.BackwardContext.BackwardToTaskActivity.ActivityID,
                runner);

            return(entity);
        }
Esempio n. 26
0
        /// <summary>
        /// 置开始节点为结束状态
        /// </summary>
        /// <param name="processInstance"></param>
        /// <param name="activityResource"></param>
        /// <param name="session"></param>
        /// <returns></returns>
        private GatewayExecutedResult CompleteAutomaticlly(WfProcessInstance processInstance, ActivityEntity activity, WfAppRunner runner)
        {
            //开始节点没前驱信息
            var fromActivityInstance = base.CreateActivityInstanceObject(base.Linker.FromActivity, processInstance, runner);

            var activityIns = base.ActivityInstanceManager.Insert(fromActivityInstance);

            base.ActivityInstanceManager.Complete(fromActivityInstance.Fid, runner);

            fromActivityInstance.ActivityState = ActivityStateEnum.Completed.ToString();
            base.Linker.FromActivityInstance   = fromActivityInstance;

            GatewayExecutedResult result = GatewayExecutedResult.CreateGatewayExecutedResult(GatewayExecutedStatus.Successed);

            return(result);
        }
        /// <summary>
        /// 创建活动实例的对象
        /// </summary>
        /// <param name="activityEntity"></param>
        /// <param name="processInstance"></param>
        /// <returns></returns>
        internal WfActivityInstance CreateActivityInstanceObject(WfProcessInstance processIns,
                                                                 ActivityEntity activityEntity,
                                                                 WfAppRunner runner)
        {
            WfActivityInstance activity = new WfActivityInstance();

            activity.Fid                 = UUIDUtils.Fid;
            activity.ActivityName        = activityEntity.ActivityName;
            activity.ProcessUid          = processIns.ProcessUid;
            activity.ActivityType        = activityEntity.ActivityType.ToString();
            activity.ApproverMethod      = activityEntity.ApproverMethod.ToString();
            activity.DirectionType       = activityEntity.GatewayDirectionType.ToString();
            activity.ProcessInsUid       = processIns.Fid;
            activity.NodeId              = activityEntity.ActivityID;
            activity.NodeName            = activityEntity.ActivityCode;
            activity.AppName             = runner.AppName;
            activity.BillUid             = runner.BillUid;
            activity.TokensRequired      = 1;
            activity.TokensHad           = 1;
            activity.AssignedToUserIds   = runner.UserId;
            activity.AssignedToUserNames = runner.UserName;
            activity.ActivityState       = WfActivityInstanceState.Ready;
            activity.CanRenewInstance    = 0;
            activity.BusinessUid         = runner.BusinessUid;
            activity.AppEmpUid           = processIns.AppEmpUid;
            activity.AppStartTime        = processIns.StartTime;
            activity.ProcessState        = processIns.ProcessState;
            activity.StartTime           = DateTimeUtils.CurrentDateTimeStr;
            if (activityEntity.BillTemplate.IsMissing())
            {
                activity.FormTemplate = processIns.FormTemplateUid;
            }
            else
            {
                activity.FormTemplate = activityEntity.BillTemplate;
            }
            if (activityEntity.FieldItems != null && activityEntity.FieldItems.Any())
            {
                activity.FormPower = activityEntity.FieldItems.ToJson();
            }
            activity.PassingRate    = activityEntity.PassRate;
            activity.AutoExecTime   = DateTimeUtils.DateTimeFormat(DateTime.Now.AddMinutes(activityEntity.Expiration));
            activity.MessageSetting = $"{{'approver':{(activityEntity.NoticeApprover ? 1 : 0)},'applicant':{(activityEntity.NoticeApplicant ? 1 : 0)},'mail':{(activityEntity.IsMail ? 1 : 0)},'message':{(activityEntity.IsMessage ? 1 : 0)}}}";
            return(activity);
        }
Esempio n. 28
0
        /// <summary>
        /// 根据邮件模板生成邮件内容
        /// </summary>
        /// <param name="processInstance"></param>
        /// <param name="content"></param>
        /// <returns></returns>
        private string BuildeMessageContent(WfProcessInstance processInstance, string content)
        {
            if (content.Contains("${业务名称}"))
            {
                content = content.Replace("${业务名称}", processInstance.ProcessName);
            }

            if (content.Contains("${业务申请人}"))
            {
                content = content.Replace("${业务申请人}", processInstance.AppEmpName);
            }

            if (content.Contains("${业务申请时间}"))
            {
                content = content.Replace("${业务申请时间}", processInstance.StartTime);
            }

            dynamic bizData = _dataAccessor.Get(processInstance.BillTable, processInstance.BillUid, true);
            if (bizData == null)
            {
                return content;
            }

            IDictionary<string, object> dicBizData = bizData as IDictionary<string, object>;
            var bizCols = _dataAccessor.Columns(processInstance.BillTable);
            Regex regex = new Regex(FapPlatformConstants.VariablePattern, RegexOptions.IgnoreCase);
            var mat = regex.Matches(content);
            foreach (Match item in mat)
            {
                string fieldName = item.ToString().Substring(2, item.ToString().Length - 3);
                var col = bizCols.FirstOrDefault(c => c.ColComment == fieldName);
                if (col == null)
                    continue;
                if (col.RefTable.IsPresent())
                {
                    content = content.Replace(item.ToString(), dicBizData[col.ColName + "MC"].ToStringOrEmpty());
                }
                else
                {
                    content = content.Replace(item.ToString(), dicBizData[col.ColName].ToStringOrEmpty());
                }
            }
            return content;
        }
Esempio n. 29
0
        /// <summary>
        /// 更新单据表(完成时)
        /// </summary>
        /// <param name="billTableName"></param>
        /// <param name="billId"></param>
        internal void UpdateBillDataWhenComplete(string billTableName, string billId)
        {
            FapTable table = DbSession.Table(billTableName);

            if (table == null || string.IsNullOrWhiteSpace(table.TableFeature))
            {
                return;
            }

            if (("," + table.TableFeature + ",").IndexOf(",BillFeature,") >= 0)
            {
                //单据数据
                dynamic billData = DbSession.Get(billTableName, billId);
                if (billData == null)
                {
                    return;
                }

                DynamicParameters parameters = new DynamicParameters();
                parameters.Add("ProcessId", ProcessId);
                //WfProcessInstance process = DbSession.QueryFirstOrDefaultEntityByWhere<WfProcessInstance>("Fid=@ProcessId", parameters);
                //WfTask task = DbSession.QueryFirstOrDefaultEntityBySql<WfTask>("select top 1 * from WfTask where ProcessId=@ProcessId order by Fid desc", parameters);
                //WfTaskAdvice taskAdvice = DbSession.QueryFirstOrDefaultEntityBySql<WfTaskAdvice>("select top 1 * from WfTaskAdvice where TaskId='" + task.Fid + "' order by Fid desc");
                WfProcessInstance process = DbSession.Get <WfProcessInstance>(ProcessId);
                WfTask            task    = DbSession.Get <WfTask>(TaskId);
                //更新单据的字段数据
                billData.CurrApprover     = task.ExecutorEmpUid;
                billData.ApprovalTime     = task.ExecuteTime;
                billData.ApprovalComments = task.Suggestion;
                if (task.ApproveState == WfApproveState.Agree)
                {
                    billData.BillStatus = BillStatus.PASSED; //同意
                }
                else if (task.ApproveState == WfApproveState.Disagree)
                {
                    billData.BillStatus = BillStatus.REJECTED; //不同意
                }

                billData.EffectiveState = 0;
                //billData.EffectiveTime = PublicUtils.GetSysDateTimeStr();

                DbSession.UpdateDynamicData(billData);
            }
        }
Esempio n. 30
0
        /// <summary>
        /// 插入连线实例的方法
        /// </summary>
        /// <param name="processInstance">流程实例</param>
        /// <param name="transitionGUID">转移GUID</param>
        /// <param name="fromActivityInstance">来源活动实例</param>
        /// <param name="toActivityInstance">目的活动实例</param>
        /// <param name="transitionType">转移类型</param>
        /// <param name="flyingType">飞跃类型</param>
        /// <param name="runner">运行者</param>
        /// <param name="session">会话</param>
        /// <returns></returns>
        internal virtual void InsertTransitionInstance(WfProcessInstance processInstance,
                                                       string transitionGUID,
                                                       WfActivityInstance fromActivityInstance,
                                                       WfActivityInstance toActivityInstance,
                                                       TransitionTypeEnum transitionType,
                                                       TransitionFlyingTypeEnum flyingType)
        {
            var tim = new TransitionInstanceManager(_serviceProvider);
            var transitionInstanceObject = tim.CreateTransitionInstanceObject(processInstance,
                                                                              transitionGUID,
                                                                              fromActivityInstance,
                                                                              toActivityInstance,
                                                                              transitionType,
                                                                              flyingType,
                                                                              _runner,
                                                                              (byte)ConditionParseResultEnum.Passed);

            tim.Insert(transitionInstanceObject);
        }