Exemple #1
0
 public static void CopyWorkflowToStepHis(WorkflowDbContext wfContext, WF_WORKFLOW_INST workflowRow,
                                          WF_STEP_INST_HIS stepRow, FlowAction flowAction)
 {
     // stepRow.SI_INDEX = workflowRow.WI_INDEX;
     stepRow.SI_INDEX = workflowRow.WI_INDEX;
     //步骤标识 0 -- 有效初始值  1 -- 无效的
     stepRow.SI_VALID_FLAG = 0;
     stepRow.SI_VALID_FLAG = 0;
     //流转方式
     stepRow.SI_FLOW_TYPE = (int?)flowAction;
     ////步骤基本信息
     stepRow.SI_ID    = wfContext.GetUniId();
     stepRow.SI_WI_ID = workflowRow.WI_ID;
     ////上一步骤信息
     stepRow.SI_LAST_STEP        = workflowRow.WI_LAST_STEP;
     stepRow.SI_LAST_STEP_NAME   = workflowRow.WI_LAST_STEP_NAME;
     stepRow.SI_LAST_MANUAL      = workflowRow.WI_LAST_MANUAL;
     stepRow.SI_LAST_MANUAL_NAME = workflowRow.WI_LAST_MANUAL_NAME;
     ////当前步骤
     stepRow.SI_CURRENT_STEP      = workflowRow.WI_CURRENT_STEP;
     stepRow.SI_CURRENT_STEP_NAME = workflowRow.WI_CURRENT_STEP_NAME;
     stepRow.SI_STEP_TYPE         = workflowRow.WI_STEP_TYPE;
     stepRow.SI_PRIORITY          = workflowRow.WI_PRIORITY;
     stepRow.SI_STATUS            = workflowRow.WI_STATUS ?? 0;
     ////当前步骤 时间信息:开始时间 结束时间 步骤用时
     stepRow.SI_START_DATE = workflowRow.WI_CURRENT_CREATE_DATE;
     stepRow.SI_END_DATE   = wfContext.Now;
     stepRow.SI_TIME_SPAN  = (double)((wfContext.Now - stepRow.SI_START_DATE.Value <DateTime>()).Ticks)
                             / TimeSpan.TicksPerDay;
     ////发送时间
     stepRow.SI_SEND_DATE = workflowRow.WI_SEND_DATE;
 }
Exemple #2
0
        public static void SendStep(Workflow workflow, StepConfig nextStep, IUnitOfData source)
        {
            DateTime now = DateTime.Now;
            //  = AtawIocContext.Current.FetchInstance<IUnitOfData>();
            WorkflowDbContext dbContext   = source as WorkflowDbContext;
            WF_WORKFLOW_INST  workflowRow = workflow.WorkflowRow;
            WorkflowContent   content     = WorkflowInstUtil.CreateContent(workflowRow);

            using (dbContext)
            {
                //拷贝新步骤
                WF_STEP_INST stepRow = new WF_STEP_INST();
                (source as WorkflowDbContext).WF_STEP_INST.Add(stepRow);
                CopyWorkflowToStep(dbContext, workflowRow, stepRow, FlowAction.Flow);
                //人工步骤的处理
                bool isManual = workflow.CurrentStep.Config.StepType == StepType.Manual;
                if (isManual)
                {
                    CopyManualInfo(workflow.WorkflowRow, stepRow);
                }
                //更新工作流实例
                workflowRow.WI_INDEX = workflowRow.WI_INDEX.Value <int>() + 1;
                if (isManual)
                {
                    workflowRow.WI_LAST_MANUAL      = workflowRow.WI_CURRENT_STEP;
                    workflowRow.WI_LAST_MANUAL_NAME = workflowRow.WI_CURRENT_STEP_NAME;
                    //更新参与人列表
                    string      refIds    = workflowRow.WI_REF_LIST;
                    QuoteIdList ulRef     = QuoteIdList.LoadFromString(refIds);
                    string      receiveId = workflowRow.WI_RECEIVE_ID;
                    string      sendId    = workflowRow.WI_SEND_ID;
                    string      processId = workflowRow.WI_PROCESS_ID;
                    ulRef.Add(receiveId);
                    ulRef.Add(sendId);
                    ulRef.Add(processId);
                    int outInt;
                    workflowRow.WI_REF_LIST = ulRef.ToString(out outInt);
                    //接收人  处理人  重新置为空
                    workflowRow.WI_RECEIVE_ID      = "";
                    workflowRow.WI_LAST_PROCESS_ID = workflowRow.WI_PROCESS_ID;
                    workflowRow.WI_PROCESS_ID      = "";
                    workflowRow.WI_RECEIVE_LIST    = "";
                    //清空超时和提醒标识
                    if (workflowRow.WI_IS_TIMEOUT.Value <bool>() == true)
                    {
                        workflowRow.WI_IS_TIMEOUT = false;
                    }
                    //清空错误处理信息 WI_ERROR_TYPE WI_MAX_RETRY_TIMES WI_RETRY_TIMES  WI_NEXT_EXE_DATE
                    WorkflowInstUtil.ClearError(workflowRow);
                }
                //更新主表信息
                SetWorkflowByStep(source, workflowRow, nextStep);
                content.SetMainRowStatus(source, nextStep);
                dbContext.Submit();
            }
            // IUnitOfData dbContext = AtawIocContext.Current.FetchInstance<IUnitOfData>();
            //ATAW_WORKFLOWContext context = dbContext as ATAW_WORKFLOWContext;
            //拷贝新步骤
            //WF_STEP_INST stepRow = new WF_STEP_INST();
        }
        private void SendNotifys(WF_WORKFLOW_INST mainRow, IUnitOfData source)
        {
            try
            {
                INotifyAction notifyAction;
                if (!NotifyActions.IsNotEmpty())
                {
                    NotifyActions.Add("DefaultNotifyAction");
                }
                //if (NotifyActions.IndexOf("NotifyAction") < 0 )
                //{
                //    NotifyActions.Add("NotifyAction");
                //}

                foreach (var notify in NotifyActions)
                {
                    notifyAction = notify.CodePlugIn <INotifyAction>();
                    notifyAction.DoPush(QuoteIdList.LoadFromString(mainRow.WI_RECEIVE_LIST), null, mainRow, source);
                    //DoActionDelegate doActionDelegate = new DoActionDelegate(notifyAction.DoAction);
                    foreach (var userID in QuoteIdList.LoadFromString(mainRow.WI_RECEIVE_LIST))
                    {
                        notifyAction.DoAction(userID, mainRow, null, source);
                        //doActionDelegate.BeginInvoke(userID, mainRow, WorkflowInstUtil.CreateContent(mainRow), source, null, null);
                    }
                }

                //----------
            }
            catch (Exception ex)
            {
                string str = "工作流触发异常:" + ex.Message;
                AtawAppContext.Current.Logger.Debug(str);
                AtawTrace.WriteFile(LogType.Error, str);
            }
        }
        public void BeginStepExecute(StepConfig stepConfig, int priority, string workflowName, WorkflowContent content, IUnitOfData context)
        {
            StringBuilder sb = new StringBuilder();

            content.SaveStringBuilder(sb);
            // throw new System.NotImplementedException();

            WorkflowDbContext wfContent = context as WorkflowDbContext;

            //ATAW_WORKFLOWContext wfContent = context as ATAW_WORKFLOWContext;
            WF_WORKFLOW_INST inst = new WF_WORKFLOW_INST();

            inst.WI_ID          = wfContent.GetUniId();
            inst.WI_CONTENT_XML = sb.ToString();
            inst.WI_NAME        = workflowName;
            wfContent.WF_WORKFLOW_INST.Add(inst);

            //步骤基本信息
            StepUtil.SetWorkflowByStep(inst, stepConfig.Name, stepConfig.DisplayName, wfContent.Now,
                                       (int)stepConfig.StepType, (int)StepState.ProcessNotSend);
            inst.WI_INDEX    = 1;
            inst.WI_PRIORITY = priority;
            //扩展信息
            //父子流程
            //主表控制
            content.SetAllMainRow(wfContent, stepConfig, inst.WI_ID);
        }
        public static void SetWorkflowByStep(WF_WORKFLOW_INST row, StepConfig stepConfig)
        {
            DateTime now = DateTime.Now;

            SetWorkflowByStep(row, stepConfig.Name, stepConfig.DisplayName, now,
                              (int)stepConfig.StepType, (int)StepState.NotReceive, now);
        }
 public static void ClearError(WF_WORKFLOW_INST workflowRow)
 {
     //清空错误处理信息 WI_ERROR_TYPE WI_MAX_RETRY_TIMES WI_RETRY_TIMES  WI_NEXT_EXE_DATE
     workflowRow.WI_ERROR_TYPE      = null;
     workflowRow.WI_MAX_RETRY_TIMES = null;
     workflowRow.WI_RETRY_TIMES     = null;
     workflowRow.WI_NEXT_EXE_DATE   = null;
 }
 public override void Prepare(WF_WORKFLOW_INST workflowRow, IUnitOfData source)
 {
     if (string.IsNullOrEmpty(workflowRow.WI_RECEIVE_LIST))
     {
         SetReceiveUserList(workflowRow, source);
     }
     //-----消息触发
     SendNotifys(workflowRow, source);
 }
Exemple #8
0
        //public static void SetWorkflowByStep(IWorkflowSource source, WF_WORKFLOW_INST workflowRow,
        //   StepConfig nextStep)
        //{
        //    workflowRow.WI_LAST_STEP = workflowRow.WI_CURRENT_STEP;
        //    workflowRow.WI_LAST_STEP_NAME = workflowRow.WI_CURRENT_STEP_NAME;

        //    WorkflowInstResolver.SetWorkflowByStep(workflowRow, nextStep);
        //    nextStep.Prepare(workflowRow, source);
        //}

        public static void SetWorkflowByStep(WF_WORKFLOW_INST row, string currName, string currDisplayName,
                                             DateTime createDateTime, int stepType, int stepStatus)
        {
            row.WI_CURRENT_STEP        = currName;
            row.WI_CURRENT_STEP_NAME   = currDisplayName;
            row.WI_CURRENT_CREATE_DATE = createDateTime;
            row.WI_STEP_TYPE           = stepType;
            row.WI_STATUS = stepStatus;
        }
        public static void ManualSendWorkflow(WF_WORKFLOW_INST row, object userId, BaseProcessor processor)
        {
            // 处理人,处理时间,状态改为PNS
            row.WI_PROCESS_ID = userId.ToString();

            row.WI_PROCESS_DATE = DateTime.Now;
            row.WI_STATUS       = (int)StepState.ProcessNotSend;
            processor.SaveContent(row);
        }
Exemple #10
0
        //public static void FinishStep(Workflow workflow, WorkflowContent content, EndStepConfig config,
        //  IUnitOfData source, BaseProcessor processor)
        //{
        //    FinishType finishType = FinishType.Normal;
        //    if (config.EnableModify)
        //    {
        //        finishType = FinishType.ModifiedNormal;
        //    }
        //    FinishData result = FinishStep(workflow, finishType,
        //        workflow.WorkflowRow["WI_PROCESS_ID"], content);

        //    source.Submit();
        //}


        public static void SetWorkflowByStep(IUnitOfData source, WF_WORKFLOW_INST workflowRow,
                                             StepConfig nextStep)
        {
            workflowRow.WI_LAST_STEP      = workflowRow.WI_CURRENT_STEP;
            workflowRow.WI_LAST_STEP_NAME = workflowRow.WI_CURRENT_STEP_NAME;

            WorkflowInstUtil.SetWorkflowByStep(workflowRow, nextStep);
            nextStep.Prepare(workflowRow, source);
        }
Exemple #11
0
        //public abstract string SourceModuleID { get; }
        public void DoAction(string userId, WF_WORKFLOW_INST mainRow, WorkflowContent content, IUnitOfData source)
        {
            IMessagesBuilder messagesBuilder = GlobalVariable.AppContext.AtawMessagesBuilder.Value;
            //Thread th = new Thread();
            string messageBody = string.Format("{0}-{1}-需要你处理", mainRow.WI_NAME, mainRow.WI_CURRENT_STEP_NAME);
            string url         = string.Format("{0}{1}", BaseUrl, mainRow.WI_ID);

            messagesBuilder.InsertMessage(Title, messageBody, url, 0, userId, MessageTypeEnum.WorkFlow, "", GlobalVariable.FControlUnitID, GlobalVariable.UserId.ToString());
        }
        public static WorkflowContent CreateContent(WF_WORKFLOW_INST row)
        {
            string contentXml = row.WI_CONTENT_XML;

            AtawDebug.AssertNotNullOrEmpty(contentXml, string.Format(ObjectUtil.SysCulture,
                                                                     "ID为{0},模式为{1}的工作流没有设置ContentXml", row.WI_ID, row.WI_WD_NAME), null);

            WorkflowContent content = XmlUtil.ReadFromString <WorkflowContent>(contentXml);

            return(content);
        }
 public bool SaveContent(WF_WORKFLOW_INST workflowRow)
 {
     if (AddContent())
     {
         StringBuilder sb = new StringBuilder();
         Content.SaveStringBuilder(sb);
         workflowRow.WI_CONTENT_XML = sb.ToString();
         return(true);
     }
     return(false);
 }
        public WF_WORKFLOW_INST GetWorkFlowInst(string id)
        {
            WF_WORKFLOW_INST workFlowInst = null;

            if (!string.IsNullOrEmpty(id))
            {
                workFlowInst = context.WF_WORKFLOW_INST.FirstOrDefault <WF_WORKFLOW_INST>(m => m.WI_ID == id);
                workFlowInst.WI_CREATE_USER = string.IsNullOrEmpty(workFlowInst.WI_CREATE_USER) ? "" : Ataw_Users.Get(workFlowInst.WI_CREATE_USER).NickName;
            }
            return(workFlowInst);
        }
Exemple #15
0
 public virtual bool Match(WF_WORKFLOW_INST mainRow, WorkflowContent content, IUnitOfData source)
 {
     //throw new NotImplementedException();
     if (mainRow.WI_CUSTOM_DATA == "0" || mainRow.WI_CUSTOM_DATA == "1")
     {
         return(mainRow.WI_CUSTOM_DATA.Value <int>() == 1);
     }
     else
     {
         return(mainRow.WI_APPROVE == 1);
     }
 }
        //public static void SetInstInfo(DataRow row, DataRow mainRow, DbContext context, string infoFieldName, string columnName)
        //{
        //    int sharpP = columnName.IndexOf("#", StringComparison.CurrentCulture);
        //    if (sharpP > -1)
        //    {
        //        string fieldName = columnName.Substring(0, sharpP);
        //        string easySearchName = columnName.Substring(sharpP + 1);
        //        EasySearch search = PlugInFactoryManager.CreateInstance<EasySearch>("EasySearch", easySearchName);
        //        string infoValue = search.Decode(context, mainRow[fieldName].ToString());
        //        row[infoFieldName] = infoValue;
        //    }
        //    else
        //    {
        //        row[infoFieldName] = mainRow[columnName];
        //    }
        //}

        public static void SaveError(WF_WORKFLOW_INST workflowRow, WorkflowException wfException)
        {
            ErrorConfig error = wfException.ErrorConfig;

            if (workflowRow.WI_STATUS.Value <StepState>() != StepState.Mistake)
            {
                workflowRow.WI_STATUS          = StepState.Mistake.Value <int>();
                workflowRow.WI_ERROR_TYPE      = (int)wfException.Reason;
                workflowRow.WI_MAX_RETRY_TIMES = error.RetryTimes;
            }
            workflowRow.WI_RETRY_TIMES   = workflowRow.WI_RETRY_TIMES.Value <int>() + 1;
            workflowRow.WI_NEXT_EXE_DATE = DateTime.Now.Add(error.Interval);
        }
Exemple #17
0
        public override void Execute(WF_WORKFLOW_INST workflowRow)
        {
            // throw new NotImplementedException();
            if (UIData != null && UIData.Tables["WF_APPROVE_HISTORY"] != null)
            {
                var approveRow = UIData.Tables["WF_APPROVE_HISTORY"].Rows[0];

                var yes = approveRow["AH_APPROVE"].ToString();

                var note = approveRow["AH_NOTE"].ToString();

                WorkflowDbContext db = Source as WorkflowDbContext;
                SetApproveYes(yes.Value <bool>(), db);
                string sql = "INSERT INTO [WF_APPROVE_HISTORY] " +
                             "([AH_ID] " +
                             ",[AH_WORKFLOW_ID] " +
                             ",[AH_STEP_NAME] " +
                             ",[AH_STEP_DISPLAY_NAME] " +
                             ",[AH_OPERATOR] " +
                             " ,[AH_APPROVE] " +
                             " ,[AH_NOTE] " +
                             " ,[AH_CREATE_ID] " +
                             " ,[AH_CREATE_DATE]) " +
                             "VALUES(@AH_ID,@AH_WORKFLOW_ID,@AH_STEP_NAME,@AH_STEP_DISPLAY_NAME,@AH_OPERATOR,@AH_APPROVE,@AH_NOTE,@AH_CREATE_ID,@AH_CREATE_DATE) ";
                // "('" + db.GetUniId() + "' " +
                // ",'" + workflowRow.WI_ID + "' " +
                //" ,'" + workflowRow.WI_CURRENT_STEP + "' " +
                // ",'" + workflowRow.WI_CURRENT_STEP_NAME + "' " +
                //" ,'" + GlobalVariable.UserId.ToString() + "' " +
                //" ," + yes +
                //" ,'" + note + "' " +
                // " ,'" + GlobalVariable.UserId.ToString() + "' " +
                //" ,'" + db.Now.ToString() + "') ";

                List <SqlParameter> dblist = new List <SqlParameter>();

                dblist.Add(new SqlParameter("@AH_ID", db.GetUniId()));
                dblist.Add(new SqlParameter("@AH_WORKFLOW_ID", workflowRow.WI_ID));
                dblist.Add(new SqlParameter("@AH_STEP_NAME", workflowRow.WI_CURRENT_STEP));
                dblist.Add(new SqlParameter("@AH_STEP_DISPLAY_NAME", workflowRow.WI_CURRENT_STEP_NAME));
                dblist.Add(new SqlParameter("@AH_OPERATOR", GlobalVariable.UserId.ToString()));
                dblist.Add(new SqlParameter("@AH_APPROVE", yes));
                dblist.Add(new SqlParameter("@AH_NOTE", note));
                dblist.Add(new SqlParameter("@AH_CREATE_ID", GlobalVariable.UserId.ToString()));
                dblist.Add(new SqlParameter("@AH_CREATE_DATE", db.Now.ToString()));
                db.RegisterSqlCommand(sql, dblist.ToArray());

                workflowRow.WI_CUSTOM_DATA = yes;
            }
        }
Exemple #18
0
        public static void CopyManualInfo(WF_WORKFLOW_INST workflowRow, WF_STEP_INST stepRow)
        {
            //当前步骤是否超时 超时时间 (超时信息)
            stepRow.SI_IS_TIMEOUT   = workflowRow.WI_IS_TIMEOUT;
            stepRow.SI_TIMEOUT_DATE = workflowRow.WI_TIMEOUT_DATE;
            //接收 发送 处理人和时间(操作信息)
            stepRow.SI_RECEIVE_ID   = workflowRow.WI_RECEIVE_ID;
            stepRow.SI_RECEIVE_DATE = workflowRow.WI_RECEIVE_DATE;

            stepRow.SI_SEND_ID   = workflowRow.WI_SEND_ID;
            stepRow.SI_SEND_DATE = workflowRow.WI_SEND_DATE;

            stepRow.SI_PROCESS_ID   = workflowRow.WI_PROCESS_ID;
            stepRow.SI_PROCESS_DATE = workflowRow.WI_PROCESS_DATE;
        }
Exemple #19
0
 public override void Prepare(WF_WORKFLOW_INST workflowRow, IUnitOfData source)
 {
     try
     {
         INotifyAction notifyAction;
         foreach (var notify in NotifyActions)
         {
             notifyAction = AtawIocContext.Current.FetchInstance <INotifyAction>(notify);
             notifyAction.DoAction(workflowRow.WI_CREATE_USER, workflowRow, null, source);
         }
     }
     catch (Exception ex)
     {
         string str = "工作流触发异常:" + ex.Message;
         AtawAppContext.Current.Logger.Debug(str);
         AtawTrace.WriteFile(LogType.Error, str);
     }
 }
Exemple #20
0
        public void DoPush(IEnumerable <string> userIds, NodeRequest nodeRequest, WF_WORKFLOW_INST mainRow, IUnitOfData source)
        {
            if (userIds == null || userIds.Count() == 0)
            {
                return;
            }
            var workflowSource = source as WorkflowDbContext;

            if (workflowSource == null)
            {
                return;
            }
            var workflowDefName = workflowSource.WF_WORKFLOW_DEF.FirstOrDefault(m => m.WD_SHORT_NAME == mainRow.WI_WD_NAME).WD_NAME;

            foreach (var userId in userIds)
            {
                var              selectsql = string.Format("SELECT NickName FROM Ataw_Users WHERE UserID=@USERID");
                var              param     = new SqlParameter("@USERID", userId);
                string           nickName  = source.QueryObject(selectsql, param).ToString();
                SnsActiveService sns       = new SnsActiveService();
                sns.SetUnitOfData(source);
                string title = string.Format(ObjectUtil.SysCulture, "待处理流程到达:"
                                             + "<a class='ACT-A-HREF' href='$$module/workflow/workflowDef$Detail${0}'>{1}</a>"
                                             + "<br/>"
                                             + "<a class='ACT-A-HREF' href='$workflow$inst$${2}'>{3}-{4}</a>", Convert.ToBase64String(Encoding.Default.GetBytes("{\"keys\":\"" + mainRow.WI_WD_NAME + "\"}")), workflowDefName, mainRow.WI_ID, mainRow.WI_NAME, mainRow.WI_CURRENT_STEP_NAME);
                sns.InsertActive(new ActiveModel()
                {
                    ItemType      = ActivityItemType.MyWork.ToString(),
                    PrivacyStatus = PrivacyType.ToMyself.ToString(),
                    SourceId      = mainRow.WI_ID,
                    SubContent    = title,
                    UserId        = userId,
                    UserName      = nickName
                });
            }

            source.ApplyFun.Add((tran) =>
            {
                NodeServerPusher.Notify(userIds, null);
                return(0);
            });
        }
 private void SetReceiveUserList(WF_WORKFLOW_INST workflowRow, IUnitOfData source)
 {
     try
     {
         QuoteIdList          list = new QuoteIdList();
         int                  count;
         IActor               actorPlug = AtawIocContext.Current.FetchInstance <IActor>(ActorRegName);
         IEnumerable <string> actors    = actorPlug.GetActors(workflowRow, source);
         list.Add(actors);
         workflowRow.WI_RECEIVE_LIST  = list.ToString(out count);
         workflowRow.WI_RECEIVE_COUNT = count;
         if (count == 0)
         {
             throw new NoActorException(this, Error, new Exception("找不到一个人"));
         }
     }
     catch (Exception ex)
     {
         throw new NoActorException(this, Error, ex);
     }
 }
Exemple #22
0
 private Workflow(string workflowId, IUnitOfData workflowSource)
     : this(workflowSource)
 {
     //Source = workflowSource;
     WorkflowDbContext dbContext = workflowSource as WorkflowDbContext;
     WF_WORKFLOW_INST  row       = dbContext.WF_WORKFLOW_INST.FirstOrDefault(a => a.WI_ID == workflowId);
     AtawDebug.AssertNotNull(row, "该流程已处理或异常,请进历史页面查看", this);
     WorkflowId  = row.WI_ID;
     WorkflowRow = row;
     Config      = WorkflowConfig.GetByName(row.WI_WD_NAME, workflowSource);
     //WorkflowConfig.ConnString =
     StepConfig stepConfig = Config.Steps[row.WI_CURRENT_STEP];
     if (stepConfig != null)
     {
         CurrentStep  = stepConfig.CreateStep(this);
         CurrentState = CurrentStep.GetState(row.WI_STATUS.Value <StepState>());
     }
     else
     {
         throw new AtawException("不存在的步骤" + row.WI_CURRENT_STEP, this);
     }
 }
Exemple #23
0
        public Workflow(IUnitOfData source, string name, RegNameList <KeyValueItem> parameter, string createUser,
                        int?parentId)
            : this(source)
        {
            //  Source = source;
            WorkflowDbContext dbContext = source as WorkflowDbContext;
            Config      = WorkflowConfig.GetByName(name, source);
            WorkflowRow = new WF_WORKFLOW_INST();
            //WorkflowRow.BeginEdit();
            WorkflowRow.WI_ID = dbContext.GetUniId();
            //WorkflowRow["WI_ID"] = id;
            WorkflowId                 = WorkflowRow.WI_ID;
            WorkflowRow.WI_WD_NAME     = name;
            WorkflowRow.WI_CREATE_USER = createUser;
            // WorkflowRow["WI_RETRIEVABLE"] = Config.Retrievable;
            ////初始化参与人列表
            WorkflowRow.WI_REF_LIST    = QuoteIdList.GetQuoteId(createUser);
            WorkflowRow.WI_CREATE_DATE = dbContext.Now;

            BeginStep step = Config.Steps.BeginStep.CreateStep(this) as BeginStep;
            step.Parameter = parameter;
            CurrentStep    = step;
            CurrentState   = BeginNRState.Instance;
        }
Exemple #24
0
 public override bool Match(WF_WORKFLOW_INST mainRow, WorkflowContent content, IUnitOfData source)
 {
     return(!base.Match(mainRow, content, source));
 }
Exemple #25
0
        public static void Abort(IUnitOfData source, WF_WORKFLOW_INST WorkflowRow, FinishType finishType = FinishType.Abort)
        {
            WorkflowDbContext    dbContext = source as WorkflowDbContext;
            WorkflowContent      content   = WorkflowInstUtil.CreateContent(WorkflowRow);
            WF_WORKFLOW_INST_HIS wfi_His   = new WF_WORKFLOW_INST_HIS();

            //copy
            wfi_His.WI_ID              = WorkflowRow.WI_ID;
            wfi_His.WI_WD_NAME         = WorkflowRow.WI_WD_NAME;
            wfi_His.WI_CONTENT_XML     = WorkflowRow.WI_CONTENT_XML;
            wfi_His.WI_NAME            = WorkflowRow.WI_NAME;
            wfi_His.WI_CREATE_DATE     = WorkflowRow.WI_CREATE_DATE;
            wfi_His.WI_CREATE_USER     = WorkflowRow.WI_CREATE_USER;
            wfi_His.WI_REF_LIST        = WorkflowRow.WI_REF_LIST;
            wfi_His.WI_IS_TIMEOUT      = WorkflowRow.WI_IS_TIMEOUT;
            wfi_His.WI_TIMEOUT_DATE    = WorkflowRow.WI_TIMEOUT_DATE;
            wfi_His.WI_NEXT_EXE_DATE   = WorkflowRow.WI_NEXT_EXE_DATE;
            wfi_His.WI_PRIORITY        = WorkflowRow.WI_PRIORITY;
            wfi_His.WI_STATUS          = WorkflowRow.WI_STATUS;
            wfi_His.WI_ERROR_TYPE      = WorkflowRow.WI_ERROR_TYPE;
            wfi_His.WI_RETRY_TIMES     = WorkflowRow.WI_RETRY_TIMES;
            wfi_His.WI_MAX_RETRY_TIMES = WorkflowRow.WI_MAX_RETRY_TIMES;
            wfi_His.WI_WE_ID           = WorkflowRow.WI_WE_ID;
            wfi_His.WI_PARENT_ID       = WorkflowRow.WI_PARENT_ID;
            wfi_His.WI_PC_FLAG         = WorkflowRow.WI_PC_FLAG;
            //赋值
            wfi_His.WI_END_DATE  = dbContext.Now;
            wfi_His.WI_END_STATE = (int)finishType;
            if (!string.IsNullOrEmpty(WorkflowRow.WI_PROCESS_ID))
            {
                wfi_His.WI_END_USER = WorkflowRow.WI_PROCESS_ID;
            }
            else
            {
                wfi_His.WI_END_USER = GlobalVariable.UserId.ToString();
            }
            //附加
            dbContext.WF_WORKFLOW_INST_HIS.Add(wfi_His);
            ////copy步骤历史
            string wiId = WorkflowRow.WI_ID;
            List <WF_STEP_INST>     stepList    = dbContext.WF_STEP_INST.Where(a => a.SI_WI_ID == wiId).ToList();
            List <WF_STEP_INST_HIS> stepListHis = new List <WF_STEP_INST_HIS>();

            foreach (var step in stepList)
            {
                //------------
                WF_STEP_INST_HIS his = new WF_STEP_INST_HIS();
                his.SI_WI_ID             = step.SI_WI_ID;
                his.SI_CURRENT_STEP      = step.SI_CURRENT_STEP;
                his.SI_CURRENT_STEP_NAME = step.SI_CURRENT_STEP_NAME;
                his.SI_END_DATE          = step.SI_END_DATE;

                his.SI_FLOW_TYPE        = step.SI_FLOW_TYPE;
                his.SI_ID               = step.SI_ID;
                his.SI_INDEX            = step.SI_INDEX;
                his.SI_IS_TIMEOUT       = step.SI_IS_TIMEOUT;
                his.SI_LAST_MANUAL      = step.SI_LAST_MANUAL;
                his.SI_LAST_MANUAL_NAME = step.SI_LAST_MANUAL_NAME;
                his.SI_LAST_STEP        = step.SI_LAST_STEP;
                his.SI_LAST_STEP_NAME   = step.SI_LAST_STEP_NAME;
                his.SI_NOTE             = step.SI_NOTE;
                his.SI_PRIORITY         = step.SI_PRIORITY;
                his.SI_PROCESS_DATE     = step.SI_PROCESS_DATE;
                his.SI_PROCESS_ID       = step.SI_PROCESS_ID;
                his.SI_RECEIVE_DATE     = step.SI_RECEIVE_DATE;
                his.SI_RECEIVE_ID       = step.SI_RECEIVE_ID;
                his.SI_SEND_DATE        = step.SI_SEND_DATE;
                his.SI_SEND_ID          = step.SI_SEND_ID;
                his.SI_START_DATE       = step.SI_START_DATE;
                his.SI_STATUS           = step.SI_STATUS;
                his.SI_STEP_TYPE        = step.SI_STEP_TYPE;
                his.SI_TIME_SPAN        = step.SI_TIME_SPAN;
                his.SI_TIMEOUT_DATE     = step.SI_TIMEOUT_DATE;

                dbContext.WF_STEP_INST.Remove(step);
                dbContext.WF_STEP_INST_HIS.Add(his);
            }
            //新增最后一个步骤到历史
            WF_STEP_INST_HIS his_step = new WF_STEP_INST_HIS();

            // dbContext.WF_STEP_INST_HIS.Add(his_step);
            StepUtil.CopyWorkflowToStepHis(dbContext, WorkflowRow, his_step, FlowAction.Flow);
            dbContext.WF_STEP_INST_HIS.Add(his_step);
            ////更新主表信息
            //删除视力表

            content.EndMainRowStatus(dbContext, finishType);
            ////主表转移先不做
            ////--提交
            dbContext.WF_WORKFLOW_INST.Remove(WorkflowRow);
            dbContext.Submit();
        }
Exemple #26
0
 public static void OverTryTimesAbort(IUnitOfData source, WF_WORKFLOW_INST WorkflowRow)
 {
     Abort(source, WorkflowRow, FinishType.OverTryTimes);
 }
Exemple #27
0
 public static void ErrorAbort(IUnitOfData source, WF_WORKFLOW_INST WorkflowRow)
 {
     Abort(source, WorkflowRow, FinishType.Error);
 }
 public static void SetWorkflowByStep(WF_WORKFLOW_INST row, string currName, string currDisplayName,
                                      DateTime createDateTime, int stepType, int stepStatus, DateTime sendTime)
 {
     row.WI_SEND_DATE = sendTime;
     SetWorkflowByStep(row, currName, currDisplayName, createDateTime, stepType, stepStatus);
 }
Exemple #29
0
        public bool ProcessManualWorkflow(WF_WORKFLOW_INST workflowRow, string userId)
        {
            WorkflowDbContext dbContext = Source as WorkflowDbContext;
            StepState         state     = (StepState)workflowRow.WI_STATUS;

            switch (state)
            {
            case StepState.NotReceive:
                // NR:
                // 检查userId是否在接受人列表中,是接收并打开,返回true,否则返回false
                //如果接受人有多个,你只是其中的一个,并且你是上个流程的处理者,不能接收 这一点可以根据配置来.....
                string      receiveIds = workflowRow.WI_RECEIVE_LIST;
                QuoteIdList ulReceive  = QuoteIdList.LoadFromString(receiveIds);
                if (ulReceive.Contains(userId))
                {
                    bool   _isAppAutoStep = "WrokflowAutoStep".AppKv <bool>(false);
                    string _ManualAskUser = AtawAppContext.Current.GetItem("ManualAskUser").Value <string>();
                    if (ulReceive.Count > 0 && (_ManualAskUser == userId) && !_isAppAutoStep)
                    {
                        //.............
                        return(false);
                    }
                    else
                    {
                        workflowRow.WI_RECEIVE_ID   = userId;
                        workflowRow.WI_STATUS       = (int)StepState.OpenNotProcess;
                        workflowRow.WI_RECEIVE_DATE = dbContext.Now;
                        Source.Submit();
                    }
                    return(true);
                }
                else
                {
                    return(false);
                }

            case StepState.ReceiveNotOpen:
                // RNO:
                // 检查接收人是否是userId,是打开,返回true,否则返回false
                if (userId == workflowRow.WI_RECEIVE_ID)
                {
                    workflowRow.WI_STATUS = (int)StepState.OpenNotProcess;
                    Source.Submit();
                    return(true);
                }
                else
                {
                    return(false);
                }

            case StepState.OpenNotProcess:
                // ONP:
                // 检查接收人是否是userId,是返回true,否则返回false
                return(userId == workflowRow.WI_RECEIVE_ID);

            default:
                AtawDebug.ThrowImpossibleCode(this);
                break;
            }

            return(false);
        }
Exemple #30
0
 public virtual void Prepare(WF_WORKFLOW_INST workflowRow, IUnitOfData source)
 {
 }