/// <summary> /// 更新任务和步骤信息到数据和缓存 /// </summary> /// <param name="db"></param> /// <param name="dmeTaskRuleStep"></param> /// <param name="cacheKey"></param> /// <param name="stepResult"></param> private static void UpdateRuleStep(SqlSugarClient db, DmeTaskRuleStep dmeTaskRuleStep, string cacheKey, Result stepResult) { dmeTaskRuleStep.Status = EnumUtil.GetEnumDisplayName(stepResult.Code); dmeTaskRuleStep.LastTime = DateUtil.CurrentTimeMillis; // 只更新状态和最后时间 db.Updateable <DmeTaskRuleStep>(dmeTaskRuleStep).UpdateColumns(ts => new { ts.Status, ts.LastTime }).ExecuteCommand(); // 刷新缓存 ServiceFactory.CacheService.ReplaceAsync(cacheKey, dmeTaskRuleStep); }
/// <summary> /// 从缓存或者db中获取任务步骤信息 /// </summary> /// <param name="db"></param> /// <param name="task"></param> /// <param name="ruleStep"></param> /// <param name="cacheKey"></param> /// <returns></returns> private DmeTaskRuleStep GetTaskRuleStep(SqlSugarClient db, DmeTask task, DmeRuleStep ruleStep, out string cacheKey) { // 先从缓存查找 cacheKey = HashUtil.Hash_2_MD5_32($"{task.SysCode}_{ruleStep.SysCode}"); DmeTaskRuleStep dmeTaskRuleStep = null; try { dmeTaskRuleStep = ServiceFactory.CacheService.Get <DmeTaskRuleStep>(cacheKey); if (dmeTaskRuleStep != null) { LOG.Info($"缓存中获取到任务步骤信息,任务id[{dmeTaskRuleStep.TaskId}],步骤id[{dmeTaskRuleStep.RuleStepId}]"); return(dmeTaskRuleStep); } } catch (Exception ex) { LOG.Warn("从缓存中获取任务步骤信息失败,详情:" + ex.Message); } // 从数据库中查找 dmeTaskRuleStep = db.Queryable <DmeTaskRuleStep>().Single(tr => tr.TaskId == task.Id && tr.RuleStepId == ruleStep.Id); return(dmeTaskRuleStep); }
/// <summary> /// 运行步骤节点 /// </summary> /// <param name="db"></param> /// <param name="task"></param> /// <param name="node"></param> private void RunRuleStepNode(SqlSugarClient db, DmeTask task, RuleStepLinkedListNode <DmeRuleStep> node) { // 先计算前置节点 if (node.Previous?.Count > 0) { foreach (var item in node.Previous) { RunRuleStepNode(db, task, item); } } DmeTaskRuleStep dmeTaskRuleStep = null; try { // 先判断任务的状态,是否被停止 DmeTask taskStatus = db.Queryable <DmeTask>().Single(t => t.SysCode == task.SysCode); if (null == taskStatus || taskStatus.Status.Equals(EnumUtil.GetEnumDisplayName(EnumSystemStatusCode.DME_STOP))) { LOG.Info($"任务[{task.SysCode}]不存在或者已被停止"); return; } dmeTaskRuleStep = this.GetTaskRuleStep(db, task, node.Value, out string cacheKey); if (dmeTaskRuleStep != null && EnumUtil.GetEnumDisplayName(EnumSystemStatusCode.DME_SUCCESS).Equals(dmeTaskRuleStep.Status)) { // 释放 dmeTaskRuleStep = null; LOG.Info($"任务[{task.SysCode}]下的步骤[{node.Value.SysCode}]已被计算过,并且状态为[success]"); return; } // 如果前置节点没有了,则计算当前节点内容 DmeRuleStepType ruleStepTypeTemp = db.Queryable <DmeRuleStepType>().Single(rst => rst.Id == node.Value.StepTypeId); IRuleStepData ruleStepData = RuleStepFactory.GetRuleStepData(ruleStepTypeTemp.Code, this.Repository, task, node.Value); if (null == ruleStepData) { throw new BusinessException((int)EnumSystemStatusCode.DME_ERROR, $"步骤工厂无法创建编码为[{ruleStepTypeTemp.Code}]的流程实例节点"); } dmeTaskRuleStep = new DmeTaskRuleStep { SysCode = GuidUtil.NewGuid(), TaskId = task.Id, RuleStepId = node.Value.Id, Status = EnumUtil.GetEnumDisplayName(EnumSystemStatusCode.DME_RUNNING), CreateTime = DateUtil.CurrentTimeMillis, LastTime = DateUtil.CurrentTimeMillis }; dmeTaskRuleStep = db.Insertable <DmeTaskRuleStep>(dmeTaskRuleStep).ExecuteReturnEntity(); // 任务步骤创建成功后,把相关信息记录在缓存中 ServiceFactory.CacheService.AddAsync(cacheKey, dmeTaskRuleStep, 60); Result stepResult = ruleStepData.Run(); UpdateRuleStep(db, dmeTaskRuleStep, cacheKey, stepResult); // 然后计算下一个步骤 if (node?.Next.Count > 0) { foreach (var item in node.Next) { RunRuleStepNode(db, task, item); } } } catch (Exception ex) { dmeTaskRuleStep.Status = EnumUtil.GetEnumDisplayName(EnumSystemStatusCode.DME_ERROR); dmeTaskRuleStep.LastTime = DateUtil.CurrentTimeMillis; // 只更新状态和最后时间 db.Updateable <DmeTaskRuleStep>(dmeTaskRuleStep).UpdateColumns(ts => new { ts.Status, ts.LastTime }).ExecuteCommand(); this.LogService.AddLogAsync(Base.Common.Log.EnumLogType.ENTITY, EnumLogLevel.ERROR, nameof(DmeTaskRuleStep), dmeTaskRuleStep.SysCode, "", ex, "", NetAssist.GetLocalHost()); } }