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(); }
public static void CopyWorkflowToStep(WorkflowDbContext wfContext, WF_WORKFLOW_INST workflowRow, WF_STEP_INST 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; }
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; }
public static bool BackStep(Workflow workflow, StepConfig backStep) { var workflowRow = workflow.WorkflowRow; var source = workflow.Source as WorkflowDbContext; var stepInst = GetBackStep(workflow, backStep); var newStepInst = new WF_STEP_INST(); source.WF_STEP_INST.Add(newStepInst); CopyWorkflowToStep(source, workflow.WorkflowRow, newStepInst, FlowAction.Back); CopyManualInfo(workflow.WorkflowRow, newStepInst); //回退步骤 修改接收人列表 和 接收人个数 //从步骤实例表中查询上次接收的人 workflowRow.WI_INDEX = stepInst.SI_INDEX; workflowRow.WI_RECEIVE_ID = stepInst.SI_RECEIVE_ID;//上次接收的人 workflowRow.WI_RECEIVE_LIST = QuoteIdList.GetQuoteId(stepInst.SI_RECEIVE_ID); workflowRow.WI_RECEIVE_COUNT = 1; workflowRow.WI_SEND_ID = GlobalVariable.UserId.ToString(); workflowRow.WI_SEND_DATE = source.Now; workflowRow.WI_LAST_MANUAL = stepInst.SI_LAST_MANUAL; workflowRow.WI_LAST_MANUAL_NAME = stepInst.SI_LAST_MANUAL_NAME; workflowRow.WI_LAST_STEP = stepInst.SI_LAST_STEP; workflowRow.WI_LAST_STEP_NAME = stepInst.SI_LAST_STEP_NAME; workflowRow.WI_CURRENT_CREATE_DATE = DateTime.Now; // stepInst.SI_VALID_FLAG = 1; WorkflowInstUtil.ClearError(workflowRow); WorkflowInstUtil.SetWorkflowByStep(workflowRow, backStep); WorkflowContent workflowContent = WorkflowInstUtil.CreateContent(workflow.WorkflowRow); workflowContent.SetMainRowStatus(source, backStep); backStep.Prepare(workflowRow, source); source.Submit(); return(true); }