/// <summary> /// 获取要素类对象 /// </summary> /// <param name="dto">参数模型</param> /// <returns></returns> public virtual TFeatureClass GetFeatureClass(InputFeatureClassDTO dto) { TWorkspace workspace; if (EnumDataSourceType.ENTERPRISE_GEODATABASE == EnumUtil.GetEnumObjByName <EnumDataSourceType>(dto.Source.Type)) { // 企业级数据库连接 OracleConn conn = JsonConvert.DeserializeObject <OracleConn>(dto.Source.Connection); workspace = this.OpenWorkspace(conn); } else { LocalConn conn = JsonConvert.DeserializeObject <LocalConn>(dto.Source.Connection); conn.Type = EnumUtil.GetEnumObjByName <EnumDataSourceType>(dto.Source.Type); workspace = this.OpenWorkspace(conn); } if (null == workspace) { throw new BusinessException((int)EnumSystemStatusCode.DME_ERROR, "获取源要素类工作空间失败"); } TFeatureClass featureClass = this.GetFeatureClass(workspace, dto.Name); if (null == featureClass) { throw new BusinessException((int)EnumSystemStatusCode.DME_ERROR, "获取源要素类对象失败"); } return(featureClass); }
public override void Init(IDictionary <string, Property> parameters) { if (0 == base.InParams?.Count) { LOG.Error("未设置输入参数"); throw new BusinessException((int)EnumSystemStatusCode.DME_ERROR, "未设置输入参数"); } if (0 == base.OutParams?.Count) { LOG.Error("未设置输出参数"); throw new BusinessException((int)EnumSystemStatusCode.DME_ERROR, "未设置输出参数"); } if (!parameters.ContainsKey(nameof(this.SourceFeatureClass))) { LOG.Error($"缺失参数[{nameof(this.SourceFeatureClass)}]"); throw new BusinessException((int)EnumSystemStatusCode.DME_ERROR, $"缺失参数[{nameof(this.SourceFeatureClass)}]"); } if (!parameters.ContainsKey(nameof(this.TargetFeatureClass))) { LOG.Error($"缺失参数[{nameof(this.SourceFeatureClass)}]"); throw new BusinessException((int)EnumSystemStatusCode.DME_ERROR, $"缺失参数[{nameof(this.TargetFeatureClass)}]"); } if (!parameters.ContainsKey(nameof(this.AnalysisType))) { LOG.Error($"缺失参数[{nameof(this.AnalysisType)}]"); throw new BusinessException((int)EnumSystemStatusCode.DME_ERROR, $"缺失参数[{nameof(this.AnalysisType)}]"); } if (parameters.ContainsKey(nameof(IsClearTemp))) { this.IsClearTemp = Boolean.Parse(parameters[nameof(IsClearTemp)].ToString()); } // 从步骤层传过来的数据已经被格式化成对象了(JSON->实体对象) this.sourceFeatureClassDTO = (InputFeatureClassDTO)parameters[nameof(this.SourceFeatureClass)].Value; //JsonConvert.DeserializeObject<InputFeatureClassDTO>(parameters[nameof(this.SourceFeatureClass)].ToString()); this.targetFeatureClassDTO = (InputFeatureClassDTO)parameters[nameof(this.TargetFeatureClass)].Value; //JsonConvert.DeserializeObject<InputFeatureClassDTO>(parameters[nameof(this.TargetFeatureClass)].ToString()); this.AnalysisType = EnumUtil.GetEnumObjByValue <AnalysisType>(int.Parse(parameters[nameof(this.AnalysisType)].Value.ToString())); base.InitComplete = true; }
public Result Run() { // 找到算法输入依赖的算法实体 AlgorithmDTO dto = this.ruleStepMeta.GetAlgorithm(); // 找到这个步骤注入的参数值 var db = base.repository.GetDbContext(); List <DmeRuleStepAttribute> stepAttributes = db.Queryable <DmeRuleStepAttribute>().Where(rsa => rsa.RuleStepId == this.step.Id).ToList(); if (0 == stepAttributes?.Count) { LOG.Warn("没有找到步骤关联的参数设置,停止执行"); return(new Result(EnumSystemStatusCode.DME_FAIL, "没有找到步骤关联的参数设置,停止执行", null)); } IDictionary <string, Property> inputParams = dto.AlgorithmInstance.InParams; // 载入参数值 IDictionary <string, Property> paraValues = new Dictionary <string, Property>(); foreach (var item in stepAttributes) { if (!inputParams.ContainsKey(item.AttributeCode)) { continue; } Property inputParaProperty = inputParams[item.AttributeCode]; if (1 == item.IsNeedPrecursor) { // 前驱参数 if (null == item.AttributeValue || string.IsNullOrEmpty(item.AttributeValue.ToString()) || !item.AttributeValue.ToString().Contains(":")) { throw new BusinessException((int)EnumSystemStatusCode.DME_ERROR, $"步骤[{step.SysCode}]的参数[{item.AttributeCode}]无效,值[{inputParaProperty.Value}]"); } string preStepName = item.AttributeValue.ToString().Split(":")[0]; string preAttributeName = item.AttributeValue.ToString().Split(":")[1]; DmeRuleStepAttribute preRuleStepAttribute = db.Queryable <DmeRuleStepAttribute, DmeRuleStep> ((rsa, rs) => new object[] { rs.Id == rsa.RuleStepId }) .Where((rsa, rs) => rs.ModelId == step.ModelId && rs.Name == preStepName && rsa.AttributeCode == preAttributeName) .Single(); if (null == preRuleStepAttribute) { throw new BusinessException((int)EnumSystemStatusCode.DME_ERROR, $"步骤[{step.SysCode}]的参数[{item.AttributeCode}]无效,找不到前驱参数信息"); } paraValues[item.AttributeCode] = base.GetStepAttributeValue(preStepName, preAttributeName);// new Property(item.AttributeCode, item.AttributeCode, EnumValueMetaType.TYPE_UNKNOWN, preRuleStepAttribute.AttributeValue); } else { if (inputParaProperty.DataType == (int)EnumValueMetaType.TYPE_FEATURECLASS) { // 这种类型,要注意解析数据源 JObject featureClassJson = JObject.Parse(item.AttributeValue.ToString()); string featureClassName = featureClassJson.GetValue("name").Value <string>(); string sourceId = featureClassJson.GetValue("source").Value <string>(); // 根据sourceId查找数据源实体 DmeDataSource dataSource = base.repository.GetDbContext().Queryable <DmeDataSource>().Single(ds => ds.SysCode == sourceId); InputFeatureClassDTO inputFeatureClassDTO = new InputFeatureClassDTO { Name = featureClassName, Source = ClassValueCopier <DataSourceDTO> .Copy(dataSource) }; paraValues[item.AttributeCode] = new Property(item.AttributeCode, item.AttributeCode, EnumValueMetaType.TYPE_OBJECT, inputFeatureClassDTO); } else { paraValues[item.AttributeCode] = new Property(item.AttributeCode, item.AttributeCode, EnumValueMetaType.TYPE_UNKNOWN, item.AttributeValue); } } } dto.AlgorithmInstance.Init(paraValues); Result result = dto.AlgorithmInstance.Execute(); // 保存输出 if (result != null && EnumUtil.GetEnumDisplayName(EnumSystemStatusCode.DME_SUCCESS).Equals(result.Status)) { base.SaveOutput(dto.AlgorithmInstance.OutParams); return(new Result(EnumSystemStatusCode.DME_SUCCESS, "执行完毕", true)); } return(new Result(EnumSystemStatusCode.DME_FAIL, "执行失败,无异常信息", false)); }