/// <summary> /// 单个表达式分析 /// </summary> /// <param name="dataAnalysisInfo">分析模型</param> /// <param name="expConfigList">表达式配置列表</param> /// <param name="returnResult">表达式分析结果</param> /// <param name="analysisPointId">绑定类型时每个类型下的测点ID</param> private void ExpressionAnalysis(JC_LargedataAnalysisConfigInfo dataAnalysisInfo, IGrouping <string, JC_SetAnalysisModelPointRecordInfo> expConfigList, List <ExpressionRealTimeResultInfo> returnResult, PointAnalysisInfo pointAnalysisInfo = null) { List <AnalysisSuccessfulPointInfo> expressionUsedPointList = new List <AnalysisSuccessfulPointInfo>(); var firstPointBindingInfo = expConfigList.FirstOrDefault(); string expressionId = firstPointBindingInfo.ExpressionId; string expression = firstPointBindingInfo.Expresstion; string expressionText = firstPointBindingInfo.Expresstion; int continueTime = firstPointBindingInfo.ContinueTime; int maxcontinueTime = firstPointBindingInfo.MaxContinueTime; if (pointAnalysisInfo != null) { expressionId = string.Format("{0}_{1}", expressionId, pointAnalysisInfo.PointId); } //是否因子值为未知 bool isUnknowFactorValue = false; //获取表达式参数因子值 foreach (var pointMapping in expConfigList) { string expressionConfigId = pointMapping.ExpressionConfigId; string pointId = pointAnalysisInfo == null ? pointMapping.PointId : pointAnalysisInfo.PointId; string pointCode = pointAnalysisInfo == null ? pointMapping.Point : pointAnalysisInfo.Point; string wz = pointAnalysisInfo == null ? pointMapping.Wz : pointAnalysisInfo.Wz; string callMethod = pointMapping.CallMethodName; if (!expressionUsedPointList.Any(q => q.PointId == pointId)) { expressionUsedPointList.Add(new AnalysisSuccessfulPointInfo() { PointId = pointId, Point = pointCode, Wz = wz }); } object[] factorValues = null; try { factorLuaService.RegisterFunction(factorCalculateService, callMethod); factorValues = factorLuaService.CallFunction(callMethod, pointId); } catch (Exception ex) { LogHelper.Error(string.Format("通过Lua调用因子({0})服务接口({1})出错:{2}", pointId + ">>" + pointMapping.FactorName, callMethod, ex.StackTrace)); } if (!isUnknowFactorValue) { object factorGetValue = (factorValues == null || factorValues.Length <= 0) ? "Unknow" : (factorValues[0] as FactorValueInfo).Value; isUnknowFactorValue = (factorGetValue.ToString() == "Unknow" || factorGetValue.ToString() == "未知") ? true : false; //if (isUnknowFactorValue) // break;//因为要替换表达式文本为测点号->因子格式所以这里取消跳出循环了. //获取到的因子值替换表达式中的表达式参数配置ID. expression = expression.Replace(expressionConfigId, factorGetValue.ToString()); } expressionText = expressionText.Replace(expressionConfigId, string.Format("{0}[{1}]->{2}", pointCode, wz, pointMapping.FactorName)); } //默认表达式计算结果为0-未知 int expressionCalculateResult = 0; if (!isUnknowFactorValue) { //计算表达式. object[] expressionLuaCalculateResult = null; try { //表达式计算结果要么true要么false expressionLuaCalculateResult = factorLuaService.ExecuteLuaScript(expression); expressionCalculateResult = bool.Parse(expressionLuaCalculateResult[0].ToString()) ? 2 : 1; } catch (Exception ex) { LogHelper.Error(string.Format("Lua计算表达式出错!表达式为:{0}, 错误消息:{1}", expressionText, ex.StackTrace)); //计算出错,表达式计算结果为未知 expressionCalculateResult = 0; } } lock (listLock) { //记录表达式实时分析结果 ExpressionRealTimeResultInfo expressionRealTimeResultInfo = expressionRealTimeResultList.FirstOrDefault(q => q.AnalysisModelId == dataAnalysisInfo.Id && q.ExpressionId == expressionId); string analysisResultText = string.Empty; switch (expressionCalculateResult) { case 1: analysisResultText = dataAnalysisInfo.FalseDescription; break; case 2: //表达式分析成立时,判断持续时间是否大于最大持续时间;如果大于持续时间,则置为分析不成立 //bool ismaxcontinuetime = false; //if (expressionRealTimeResultInfo != null) //{ // int actualContinueTime = Convert.ToInt32((DateTime.Now - expressionRealTimeResultInfo.FirstSuccessfulTime).TotalSeconds); // if (maxcontinueTime > 0 && maxcontinueTime < actualContinueTime) // ismaxcontinuetime = true; //} //if (ismaxcontinuetime) //{ // analysisResultText = dataAnalysisInfo.FalseDescription; // expressionCalculateResult = 1; //} //else //{ // analysisResultText = dataAnalysisInfo.TrueDescription; // foreach (var item in expressionUsedPointList) // { // if (!dataAnalysisInfo.AnalysisSuccessfulPointList.Any(q => q.PointId == item.PointId)) // dataAnalysisInfo.AnalysisSuccessfulPointList.Add(item); // } //} analysisResultText = dataAnalysisInfo.TrueDescription; foreach (var item in expressionUsedPointList) { if (!dataAnalysisInfo.AnalysisSuccessfulPointList.Any(q => q.PointId == item.PointId)) { dataAnalysisInfo.AnalysisSuccessfulPointList.Add(item); } } //dataAnalysisInfo.AnalysisSuccessfulPointList.AddRange(expressionUsedPointList.Except(dataAnalysisInfo.AnalysisSuccessfulPointList)); break; default: analysisResultText = "未知"; break; } if (expressionRealTimeResultInfo == null) { expressionRealTimeResultInfo = new ExpressionRealTimeResultInfo() { AnalysisModelId = dataAnalysisInfo.Id, AnalysisModelName = dataAnalysisInfo.Name, ExpressionId = expressionId, Expression = expression, ExpressionText = expressionText, AnalysisResult = expressionCalculateResult, AnalysisResultText = analysisResultText, FirstSuccessfulTime = expressionCalculateResult == 2 ? DateTime.Now : DateTime.MinValue, LastAnalysisTime = DateTime.Now, ContinueTime = continueTime, MaxContinueTime = maxcontinueTime, ActualContinueTime = 0 }; expressionRealTimeResultList.Add(expressionRealTimeResultInfo); } else { expressionRealTimeResultInfo.AnalysisResult = expressionCalculateResult; expressionRealTimeResultInfo.AnalysisResultText = analysisResultText; expressionRealTimeResultInfo.LastAnalysisTime = DateTime.Now; expressionRealTimeResultInfo.ExpressionText = expressionText; if (expressionCalculateResult == 2 && expressionRealTimeResultInfo.FirstSuccessfulTime == DateTime.MinValue) { expressionRealTimeResultInfo.FirstSuccessfulTime = DateTime.Now; } if (expressionCalculateResult == 2) { expressionRealTimeResultInfo.ActualContinueTime = Convert.ToInt64((expressionRealTimeResultInfo.LastAnalysisTime - expressionRealTimeResultInfo.FirstSuccessfulTime).TotalSeconds); } else { expressionRealTimeResultInfo.FirstSuccessfulTime = DateTime.MinValue; expressionRealTimeResultInfo.ActualContinueTime = 0; } } returnResult.Add(ObjectConverter.DeepCopy(expressionRealTimeResultInfo)); } }
private void RefreshData() { while (!StaticClass.SystemOut) { try { Basic.Framework.Web.BasicResponse <List <JC_LargedataAnalysisConfigInfo> > response = largeDataAnalysisCacheClientService.GetAllLargeDataAnalysisConfigCache(new Sys.Safety.Request.LargeDataAnalysisCacheClientGetAllRequest()); if (response.Data != null) { //var dataSource = from q in response.Data.AsQueryable() // select new // { // Name = q.Name, // AnalysisTime = q.AnalysisTime.HasValue ? q.AnalysisTime.Value.ToString("yyyy/MM/dd HH:mm:ss") : string.Empty, // AnalysisResultText = q.AnalysisResultText, // ExpressionRealTimeResultList = ( // from rt in q.ExpressionRealTimeResultList // select new { AnalysisModelName = rt.AnalysisModelName, // ExpressionText = rt.ExpressionText, // FirstSuccessfulTime = rt.FirstSuccessfulTime == DateTime.MinValue ? string.Empty : rt.FirstSuccessfulTime.ToString("yyyy/MM/dd HH:mm:ss"), // LastAnalysisTime = rt.LastAnalysisTime == DateTime.MinValue ? string.Empty : rt.LastAnalysisTime.ToString("yyyy/MM/dd HH:mm:ss"), // AnalysisResultText = rt.AnalysisResultText, // ActualContinueTime = string.Format("{0}:{1}:{2}", (rt.ActualContinueTime / 3600).ToString().PadLeft(2, '0'), // (rt.ActualContinueTime % 3600 / 60).ToString().PadLeft(2, '0'), (rt.ActualContinueTime % 3600 % 60).ToString().PadLeft(2, '0')) }).ToList() // }; //gridList.Clear(); foreach (var item in response.Data) { bool isHaveModel = false; foreach (var itemGrid in gridList) { //old列表 if (itemGrid.Id == item.Id) { //分析模型已存在 isHaveModel = true; itemGrid.AnalysisTime = item.AnalysisTime; itemGrid.AnalysisResultText = item.AnalysisResultText; itemGrid.Name = item.Name; #region 分析列表 if (item.ExpressionRealTimeResultList != null) { //old列表 if (itemGrid.ExpressionRealTimeResultList != null && itemGrid.ExpressionRealTimeResultList.Count > 0) { //追加 foreach (var itemExpression in item.ExpressionRealTimeResultList) { //新分析数据 bool isAdd = true; foreach (var itemResult in itemGrid.ExpressionRealTimeResultList) {//old列表 if (itemResult.ExpressionId == itemExpression.ExpressionId) { isAdd = false; itemResult.ShowFirstSuccessfulTime = itemExpression.FirstSuccessfulTime == DateTime.MinValue ? string.Empty : itemExpression.FirstSuccessfulTime.ToString("yyyy/MM/dd HH:mm:ss"); itemResult.ShowLastAnalysisTime = itemExpression.LastAnalysisTime == DateTime.MinValue ? string.Empty : itemExpression.LastAnalysisTime.ToString("yyyy/MM/dd HH:mm:ss"); itemResult.AnalysisResultText = itemExpression.AnalysisResultText; itemResult.ShowActualContinueTime = string.Format("{0}:{1}:{2}", (itemExpression.ActualContinueTime / 3600).ToString().PadLeft(2, '0'), (itemExpression.ActualContinueTime % 3600 / 60).ToString().PadLeft(2, '0'), (itemExpression.ActualContinueTime % 3600 % 60).ToString().PadLeft(2, '0')); break; } } if (isAdd) { ExpressionRealTimeResultInfo modelInfo = new ExpressionRealTimeResultInfo(); modelInfo.ExpressionText = itemExpression.ExpressionText; modelInfo.ExpressionId = itemExpression.ExpressionId; modelInfo.ShowFirstSuccessfulTime = itemExpression.FirstSuccessfulTime == DateTime.MinValue ? string.Empty : itemExpression.FirstSuccessfulTime.ToString("yyyy/MM/dd HH:mm:ss"); modelInfo.ShowLastAnalysisTime = itemExpression.LastAnalysisTime == DateTime.MinValue ? string.Empty : itemExpression.LastAnalysisTime.ToString("yyyy/MM/dd HH:mm:ss"); modelInfo.AnalysisResultText = itemExpression.AnalysisResultText; modelInfo.ShowActualContinueTime = string.Format("{0}:{1}:{2}", (itemExpression.ActualContinueTime / 3600).ToString().PadLeft(2, '0'), (itemExpression.ActualContinueTime % 3600 / 60).ToString().PadLeft(2, '0'), (itemExpression.ActualContinueTime % 3600 % 60).ToString().PadLeft(2, '0')); itemGrid.ExpressionRealTimeResultList.Add(modelInfo); } } } else {//新增 List <ExpressionRealTimeResultInfo> expressionRealTimeResultList = new List <ExpressionRealTimeResultInfo>(); foreach (var itemExpression in item.ExpressionRealTimeResultList) { ExpressionRealTimeResultInfo modelInfo = new ExpressionRealTimeResultInfo(); modelInfo.ExpressionText = itemExpression.ExpressionText; modelInfo.ExpressionId = itemExpression.ExpressionId; modelInfo.ShowFirstSuccessfulTime = itemExpression.FirstSuccessfulTime == DateTime.MinValue ? string.Empty : itemExpression.FirstSuccessfulTime.ToString("yyyy/MM/dd HH:mm:ss"); modelInfo.ShowLastAnalysisTime = itemExpression.LastAnalysisTime == DateTime.MinValue ? string.Empty : itemExpression.LastAnalysisTime.ToString("yyyy/MM/dd HH:mm:ss"); modelInfo.AnalysisResultText = itemExpression.AnalysisResultText; modelInfo.ShowActualContinueTime = string.Format("{0}:{1}:{2}", (itemExpression.ActualContinueTime / 3600).ToString().PadLeft(2, '0'), (itemExpression.ActualContinueTime % 3600 / 60).ToString().PadLeft(2, '0'), (itemExpression.ActualContinueTime % 3600 % 60).ToString().PadLeft(2, '0')); expressionRealTimeResultList.Add(modelInfo); } itemGrid.ExpressionRealTimeResultList = expressionRealTimeResultList; } } #endregion } } if (isHaveModel == false) { JC_LargedataAnalysisConfigInfo model = new JC_LargedataAnalysisConfigInfo(); model.Id = item.Id; model.Name = item.Name; model.AnalysisTime = item.AnalysisTime; model.AnalysisResultText = item.AnalysisResultText; List <ExpressionRealTimeResultInfo> expressionRealTimeResultList = new List <ExpressionRealTimeResultInfo>(); if (item.ExpressionRealTimeResultList != null) { foreach (var itemExpression in item.ExpressionRealTimeResultList) { ExpressionRealTimeResultInfo modelInfo = new ExpressionRealTimeResultInfo(); modelInfo.ExpressionText = itemExpression.ExpressionText; modelInfo.ExpressionId = itemExpression.ExpressionId; modelInfo.ShowFirstSuccessfulTime = itemExpression.FirstSuccessfulTime == DateTime.MinValue ? string.Empty : itemExpression.FirstSuccessfulTime.ToString("yyyy/MM/dd HH:mm:ss"); modelInfo.ShowLastAnalysisTime = itemExpression.LastAnalysisTime == DateTime.MinValue ? string.Empty : itemExpression.LastAnalysisTime.ToString("yyyy/MM/dd HH:mm:ss"); modelInfo.AnalysisResultText = itemExpression.AnalysisResultText; modelInfo.ShowActualContinueTime = string.Format("{0}:{1}:{2}", (itemExpression.ActualContinueTime / 3600).ToString().PadLeft(2, '0'), (itemExpression.ActualContinueTime % 3600 / 60).ToString().PadLeft(2, '0'), (itemExpression.ActualContinueTime % 3600 % 60).ToString().PadLeft(2, '0')); expressionRealTimeResultList.Add(modelInfo); } } model.ExpressionRealTimeResultList = expressionRealTimeResultList; gridList.Add(model); } } MethodInvoker In = new MethodInvoker(() => { if (gridList != null) { int topRowIndex = gridView1.TopRowIndex; gridView1.RefreshData(); for (int i = 0; i < gridView1.RowCount; i++) { //默认展开所有子项 //gridView1.ExpandMasterRow(i); DevExpress.XtraGrid.Views.Base.BaseView childView = gridView1.GetVisibleDetailView(i); if (childView != null) { childView.RefreshData(); } } gridView1.TopRowIndex = topRowIndex; } }); if (gridControlData.InvokeRequired) { gridControlData.Invoke(In); } } } catch (Exception ex) { LogHelper.Error(ex.Message); } Thread.Sleep(4000); } }
/// <summary> /// 更新分析模型。 /// </summary> /// <param name="jc_LargedataAnalysisConfigRsequest">更新模型请求对象</param> /// <returns>Mas应答对象包含分析模型</returns> public BasicResponse <JC_LargedataAnalysisConfigInfo> UpdateLargeDataAnalysisConfig(LargedataAnalysisConfigUpdateRequest jc_LargedataAnalysisConfigRsequest) { BasicResponse validationResponse = largeDataAnalysisConfigValidation(jc_LargedataAnalysisConfigRsequest.JC_LargedataAnalysisConfigInfo); if (!validationResponse.IsSuccess) { return new BasicResponse <JC_LargedataAnalysisConfigInfo>() { Code = validationResponse.Code, Message = validationResponse.Message, Data = jc_LargedataAnalysisConfigRsequest.JC_LargedataAnalysisConfigInfo } } ; if (string.IsNullOrEmpty(jc_LargedataAnalysisConfigRsequest.JC_LargedataAnalysisConfigInfo.Id)) { return(new BasicResponse <JC_LargedataAnalysisConfigInfo>() { Code = 1, Message = "分析模型ID为空", Data = jc_LargedataAnalysisConfigRsequest.JC_LargedataAnalysisConfigInfo }); } var _jC_Largedataanalysisconfig = ObjectConverter.Copy <JC_LargedataAnalysisConfigInfo, JC_LargedataanalysisconfigModel>(jc_LargedataAnalysisConfigRsequest.JC_LargedataAnalysisConfigInfo); var _jcSetAnalysisModelPointRecordList = ObjectConverter.CopyList <JC_SetAnalysisModelPointRecordInfo, JC_SetanalysismodelpointrecordModel>(jc_LargedataAnalysisConfigRsequest.JC_LargedataAnalysisConfigInfo.AnalysisModelPointRecordInfoList); bool isSingleExpressionAndParameter1 = isSingleExpressionAndParameter(jc_LargedataAnalysisConfigRsequest.JC_LargedataAnalysisConfigInfo.TempleteId); bool isBindDevType = jc_LargedataAnalysisConfigRsequest.JC_LargedataAnalysisConfigInfo.AnalysisModelPointRecordInfoList[0].DevTypeId > -1; if (isSingleExpressionAndParameter1 && _jcSetAnalysisModelPointRecordList.Count > 0 && !isBindDevType) { _jC_Largedataanalysisconfig.Name = System.Text.RegularExpressions.Regex.Replace(_jC_Largedataanalysisconfig.Name, "\\(\\w+\\)", string.Format("({0})", jc_LargedataAnalysisConfigRsequest.JC_LargedataAnalysisConfigInfo.AnalysisModelPointRecordInfoList[0].Point)); } JC_LargedataanalysisconfigModel existsModel = _Repository.GetLargeDataAnalysisConfigByName(_jC_Largedataanalysisconfig.Name); if (null != existsModel && existsModel.Id != _jC_Largedataanalysisconfig.Id) { return new BasicResponse <JC_LargedataAnalysisConfigInfo>() { Code = -100, Message = "分析模型名称已存在", Data = jc_LargedataAnalysisConfigRsequest.JC_LargedataAnalysisConfigInfo } } ; TransactionsManager.BeginTransaction(() => { //更新分析模型 //_jC_Largedataanalysisconfig.UpdatedTime = DateTime.Now; //更新时间不变化,这里将分析模型名称改了再改回来。 string analysisModelName = _jC_Largedataanalysisconfig.Name; _jC_Largedataanalysisconfig.Name = analysisModelName + "1"; _Repository.UpdateJC_Largedataanalysisconfig(_jC_Largedataanalysisconfig); _jC_Largedataanalysisconfig.Name = analysisModelName; _Repository.UpdateJC_Largedataanalysisconfig(_jC_Largedataanalysisconfig); //先删除再插入 _AnalysisModelPointRecordRepository.DeleteAnalysisModelPointRecordByAnalysisModelId(_jC_Largedataanalysisconfig.Id); foreach (var item in _jcSetAnalysisModelPointRecordList) { //item.Id = IdHelper.CreateGuidId(); item.Id = IdHelper.CreateLongId().ToString(); item.AnalysisModelId = _jC_Largedataanalysisconfig.Id; } //插入模型测点关联记录 _AnalysisModelPointRecordRepository.Insert(_jcSetAnalysisModelPointRecordList); }); var jC_Largedataanalysisconfigresponse = new BasicResponse <JC_LargedataAnalysisConfigInfo>(); jC_Largedataanalysisconfigresponse.Data = ObjectConverter.Copy <JC_LargedataanalysisconfigModel, JC_LargedataAnalysisConfigInfo>(_jC_Largedataanalysisconfig); BasicResponse <IList <JC_SetAnalysisModelPointRecordInfo> > pointListResponse = _AnalysisModelPointRecordService.GetCustomizationAnalysisModelPointRecordInfoByModelId(new SetAnalysisModelPointRecordByModelIdGetRequest() { AnalysisModelId = _jC_Largedataanalysisconfig.Id }); if (pointListResponse != null && pointListResponse.Data != null) { jC_Largedataanalysisconfigresponse.Data.AnalysisModelPointRecordInfoList = pointListResponse.Data.ToList(); } try { jC_Largedataanalysisconfigresponse.Data.AnalysisResult = 0; jC_Largedataanalysisconfigresponse.Data.AnalysisTime = null; //更新实时显示到缓存,这样客户端刷新就可以看到。不用等到分析周期. 开始 jC_Largedataanalysisconfigresponse.Data.ExpressionRealTimeResultList = new List <ExpressionRealTimeResultInfo>(); if (jC_Largedataanalysisconfigresponse.Data.AnalysisModelPointRecordInfoList != null && jC_Largedataanalysisconfigresponse.Data.AnalysisModelPointRecordInfoList.Count > 0) { IEnumerable <IGrouping <string, JC_SetAnalysisModelPointRecordInfo> > expressionGroup = jC_Largedataanalysisconfigresponse.Data.AnalysisModelPointRecordInfoList.GroupBy(p => p.ExpressionId); foreach (IGrouping <string, JC_SetAnalysisModelPointRecordInfo> expressionParameterList in expressionGroup) { if (expressionParameterList.FirstOrDefault().DevTypeId == -1)//绑定测点的情况才更新实时显示的表达式 { ExpressionRealTimeResultInfo addInitializeResultInfo = new ExpressionRealTimeResultInfo(); addInitializeResultInfo.AnalysisModelId = jC_Largedataanalysisconfigresponse.Data.Id; addInitializeResultInfo.AnalysisModelName = jC_Largedataanalysisconfigresponse.Data.Name; addInitializeResultInfo.ExpressionId = expressionParameterList.FirstOrDefault().ExpressionId; addInitializeResultInfo.Expression = expressionParameterList.FirstOrDefault().Expresstion; addInitializeResultInfo.ExpressionText = expressionParameterList.FirstOrDefault().Expresstion; addInitializeResultInfo.FirstSuccessfulTime = DateTime.MinValue; addInitializeResultInfo.LastAnalysisTime = DateTime.MinValue; addInitializeResultInfo.AnalysisResult = 0; addInitializeResultInfo.AnalysisResultText = "未知"; addInitializeResultInfo.ContinueTime = expressionParameterList.FirstOrDefault().ContinueTime; addInitializeResultInfo.MaxContinueTime = expressionParameterList.FirstOrDefault().MaxContinueTime; addInitializeResultInfo.ActualContinueTime = 0; foreach (var pointMapping in expressionParameterList) { addInitializeResultInfo.ExpressionText = addInitializeResultInfo.ExpressionText.Replace(pointMapping.ExpressionConfigId, string.Format("{0}->{1}", pointMapping.PointId, pointMapping.FactorName)); } jC_Largedataanalysisconfigresponse.Data.ExpressionRealTimeResultList.Add(addInitializeResultInfo); } } } //更新实时显示到缓存,这样客户端刷新就可以看到。不用等到分析周期. 结束 //更新缓存 _LargeDataAnalysisConfigCacheService.UpdateLargeDataAnalysisConfigCahce(new LargeDataAnalysisConfigCacheUpdateRequest() { LargeDataAnalysisConfigInfo = jC_Largedataanalysisconfigresponse.Data }); } catch (Exception ex) { Basic.Framework.Logging.LogHelper.Error(string.Format("更新分析模型后再更新缓存出错:{0}", ex.StackTrace)); } if (Basic.Framework.Data.PlatRuntime.Items.ContainsKey(DataContract.UserRoleAuthorize.KeyConst.AnalysisModelChangedKey)) { Basic.Framework.Data.PlatRuntime.Items[DataContract.UserRoleAuthorize.KeyConst.AnalysisModelChangedKey] = DateTime.Now; } else { Basic.Framework.Data.PlatRuntime.Items.Add(DataContract.UserRoleAuthorize.KeyConst.AnalysisModelChangedKey, DateTime.Now); } return(jC_Largedataanalysisconfigresponse); }