/// <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); } }
internal WfProcessInstance Insert(WfProcessInstance wfProcessInstance) { long id = _dataAccessor.Insert <WfProcessInstance>(wfProcessInstance); wfProcessInstance.Id = id; return(wfProcessInstance); }
/// <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); } }
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); }
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); }
/// <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); } } }
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); }
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); }
/// <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); }
/// <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); }
/// <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); }
/// <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; }
/// <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 ) { }
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); }
/// <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); }
/// <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; }
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); }
/// <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); }
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); }
/// <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); }
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); }
/// <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(); }
private WfActivityInstance CreateActivityInstance(WfProcess process, WfProcessInstance processInstance, WfActivity activity, WfActivityState state, long assignToUserId, string assignToUserName) { return(CreateActivityInstance(process, processInstance, activity, state, $"[{assignToUserId}]", assignToUserName)); }
/// <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); }
/// <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); }
/// <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; }
/// <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); } }
/// <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); }