public int Callback(string mqId) { var filter = TableFilter.New().Equals("id", mqId); var eventEntity = _DataAccess.Query(WFTEventEntity.TableCode).FixField("*").Where(filter).QueryFirst <WFTEventEntity>(); if (eventEntity == null) { throw new Exception($"回调任务{mqId}不存在"); } if (eventEntity.ProcessDate == DateTime.MinValue) { throw new Exception($"回到任务会处理完毕,请稍后回调"); } var tinsEntity = _WFTask.GetTinsById(eventEntity.Tinsid); var taskEntity = _WFTask.GetTaskById(eventEntity.Taskid); var fins = _WorkFlowIns.GetFlowInstance(eventEntity.Finsid); var bisJsonData = GetBisData(taskEntity, eventEntity.Dataid, fins.ServiceId, eventEntity.Tinsid, out bool isMultipleNextTask); var nextTasks = _WFTask.GetNextTasks(taskEntity, tinsEntity, bisJsonData); if (nextTasks.Length != 1) { throw new Exception("流程配置错误,下个任务节点数量必须是1"); } taskEntity.ReplaceTemplateInfo(bisJsonData); using (var tran = TransHelper.BeginTrans()) { //1、更新任务实例状态 eventEntity.State = EDBEntityState.Modified; eventEntity.Waitcallback = 0; eventEntity.Callbackdate = DateTime.Now; _DataAccess.Update(eventEntity); tinsEntity.State = EDBEntityState.Modified; tinsEntity.Edate = DateTime.Now; _DataAccess.Update(tinsEntity); //2、找下个任务节点,并流转,回调节点不应该有多个下个节点 //如果下一个节点是聚合节点,则需要加锁,防止与回调冲突。默认等待10S if (nextTasks[0].Type == ETaskType.JuHe) { var lockKey = $"{MutexConfig.WORKFLOWLOCKPRE}{fins.Dataid}"; var success = ExeWithLock(lockKey, MutexConfig.WORKFLOWLOCKTIMEOUT, () => { ExeNextTask(fins, nextTasks); tran.Commit(); }); if (!success) { throw new Exception($"未获取独占锁,请重试,dataid:{fins.Dataid }"); } } else { ExeNextTask(fins, nextTasks); tran.Commit(); } } return(1); }
private int Run(WFTEventEntity eventEntity) { var taskEntity = _WFTask.GetTaskById(eventEntity.Taskid); var taskSetting = _WFTask.GetTaskInfo(taskEntity); var tinsEntity = _WFTask.GetTinsById(eventEntity.Tinsid); var fins = _WorkFlowIns.GetFlowInstance(eventEntity.Finsid); var bisJsonData = GetBisData(taskEntity, eventEntity.Dataid, fins.ServiceId, eventEntity.Tinsid, out bool isMultipleNextTask); if (isMultipleNextTask && string.IsNullOrWhiteSpace(bisJsonData)) { throw new Exception("获取远端数据异常,请检查远端应用是否正常 "); } taskEntity.ReplaceTemplateInfo(bisJsonData); using (var tran = TransHelper.BeginTrans()) { //1、执行具体任务,并更新信息 var continueRun = taskSetting.RunTask(taskEntity, fins, tinsEntity, eventEntity); eventEntity.State = EDBEntityState.Modified; eventEntity.Status = 1; eventEntity.ProcessDate = DateTime.Now; _DataAccess.Update(eventEntity); if (continueRun) { //2、更新任务实例 tinsEntity.State = EDBEntityState.Modified; tinsEntity.Edate = DateTime.Now; _DataAccess.Update(tinsEntity); //3、生成下一个节点任务实例、并执行流转 var nextTasks = _WFTask.GetNextTasks(taskEntity, tinsEntity, bisJsonData); //如果下一个节点是聚合节点,则需要加锁,防止与回调冲突。默认等待10S if (nextTasks.Length == 1 && nextTasks[0].Type == ETaskType.JuHe) { var lockKey = $"{MutexConfig.WORKFLOWLOCKPRE}{fins.Dataid}"; var success = ExeWithLock(lockKey, MutexConfig.WORKFLOWLOCKTIMEOUT, () => { ExeNextTask(fins, nextTasks); tran.Commit(); }); if (!success) { throw new Exception($"未获取独占锁,请重试,dataid:{fins.Dataid }"); } } else { ExeNextTask(fins, nextTasks); tran.Commit(); } } else { tran.Commit(); } } return(1); }
/// <summary> /// 回调任务并注册错误信息 /// </summary> /// <param name="mqId"></param> /// <param name="errorMsg"></param> /// <returns></returns> public int CallbackForTaskError(string mqId, string errorMsg) { var filter = TableFilter.New().Equals("id", mqId); var eventEntity = _DataAccess.Query(WFTEventEntity.TableCode).FixField("*").Where(filter).QueryFirst <WFTEventEntity>(); if (eventEntity == null) { throw new Exception($"回调任务{mqId}不存在"); } //判断任务节点状态是否正确 if (eventEntity.Waitcallback == 0) { throw new Exception($"回调任务{mqId}已经回调,无法继续处理"); } if (eventEntity.Status == -1) { throw new Exception($"回调任务{mqId}已标记为异常,请尝试修复"); } //插入 异常消息 var flowEntity = _DataAccess.Query(WFFinsEntity.TableCode).FixField("ID,STATUS").Where(TableFilter.New().Equals("ID", eventEntity.Finsid)).QueryFirst <WFFinsEntity>(); using (var tran = TransHelper.BeginTrans()) { //流程实例更新为失败 flowEntity.Status = -1; _DataAccess.Update(flowEntity); //1、更新任务实例状态 eventEntity.State = EDBEntityState.Modified; eventEntity.Status = -1; //标记失败 _DataAccess.Update(eventEntity); //写入event异常日志 WFTEventMsgEntity en = _DataAccess.GetNewEntity <WFTEventMsgEntity>(); en.EventId = mqId; en.CDate = DateTime.Now; en.Remark = errorMsg; en.RepairDate = new DateTime(9999, 12, 31); en.FinsId = flowEntity.ID; _DataAccess.Update(en); tran.Commit(); } return(1); }
public int Start(string serviceId, string dataId, string name) { var filter = TableFilter.New().Equals("status", 0); //根据业务id获取当前版本的id var serviceEntity = _DataAccess.Query(WFServiceEntity.TableCode).FixField("id,currentflowid").Where(TableFilter.New().Equals("ID", serviceId)).QueryFirst <WFServiceEntity>(); if (serviceEntity == null || string.IsNullOrWhiteSpace(serviceEntity.Currentflowid)) { return(0); } var startTask = _WFTask.GetStartTask(serviceEntity.Currentflowid); if (startTask == null) { throw new Exception("没有找到开始节点"); } //判断是否 var bisJsonData = GetBisData(startTask, dataId, serviceId, string.Empty, out bool isMultipleNextTask); using (var trans = TransHelper.BeginTrans()) { //1、创建流程实例、开始节点实例,执行开始节点任务 var fins = _WorkFlowIns.CreatFlowInstance(serviceEntity.ID, serviceEntity.Currentflowid, dataId, name); var tinsStart = _WFTask.CreateTaskIns(fins, startTask); var startTaskSetting = _WFTask.GetTaskInfo(startTask); startTaskSetting.RunTask(startTask, fins, tinsStart, null); var nextTasks = _WFTask.GetNextTasks(startTask, tinsStart, bisJsonData); if (nextTasks == null || nextTasks.Length != 1) { throw new Exception("没有找到唯一的下一个任务节点"); } //如果找到多个下个任务节点,则需要获取业务数据 var nextTask = nextTasks[0]; var tinsNext = _WFTask.CreateTaskIns(fins, nextTask); _WFTask.GetTaskInfo(nextTask).CreateJob(fins, tinsNext, IsNeedCallback(nextTask.Type)); trans.Commit(); } return(1); }
/// <summary> /// 流程废弃 /// </summary> /// <param name="mqId"></param> /// <returns></returns> public CommonResult <int> GiveUp(string mqId, string reason) { //根据MQID var en = this._WfTEventDal.Get(mqId); if (en == null) { return(new WarnResult($"回调任务{mqId}不存在")); } //判断任务节点状态是否正确 if (en.Waitcallback == 0) { return(new WarnResult($"回调任务{mqId}已经回调,无法继续处理")); } var enFins = this._WfFinsDal.Get(en.Finsid); if (enFins == null) { return(new WarnResult("未找到此流程")); } if (!(enFins.Status == (int)EFlowStatus.Starting || enFins.Status == (int)EFlowStatus.Error)) { return(new WarnResult("非审批中的流程不能废弃!")); } using (var tran = TransHelper.BeginTrans()) { var num = this._DataAccess.Update(WFFinsEntity.TableCode).Set("Status", (int)EFlowStatus.GiveUp).Where(TableFilter.New().Equals("ID", enFins.ID)).ExecuteNonQuery(); if (num > 0) { this._DataAccess.Update(WFTinsEntity.TableCode) .Set("EDATE", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")) .Set("Memo", $"因为[{reason}]废弃流程") .Where(TableFilter.New().Equals("FinsId", enFins.ID).IsNull("EDATE")) .ExecuteNonQuery(); } tran.Commit(); } return(1); }
public int UpdateTemplate(WFFlowEntity flowEntity) { if (null == flowEntity) { throw new ArgumentException($"{nameof(flowEntity)} is not null"); } using (var trans = TransHelper.BeginTrans()) { foreach (var task in flowEntity?.Tasks ?? new List <WFTaskEntity>()) { var taskEntity = new WFTaskEntity(); taskEntity.State = task.State; if (task.State == EDBEntityState.Added) { taskEntity.Flowid = flowEntity.ID; taskEntity.Name = task.Name; } taskEntity.ID = task.ID; taskEntity.X = task.X; taskEntity.Y = task.Y; taskEntity.Type = task.Type; taskEntity.Name = task.Name; DataAccess.Update(taskEntity); } foreach (var link in flowEntity?.Links ?? new List <WFLinkEntity>()) { var linkEntity = new WFLinkEntity(); linkEntity.State = link.State; if (link.State == EDBEntityState.Added) { linkEntity.Flowid = flowEntity.ID; } linkEntity.ID = link.ID; linkEntity.Begintaskid = link.Begintaskid; linkEntity.Endtaskid = link.Endtaskid; var count = DataAccess.Update(linkEntity); } trans.Commit(); } return(1); }