public List <WorkingData> Map(ISOTime time, IEnumerable <ISOSpatialRow> isoSpatialRows, DeviceElementUse deviceElementUse, DeviceElementHierarchy isoDeviceElementHierarchy, List <DeviceElementUse> pendingDeviceElementUses, Dictionary <string, List <ISOProductAllocation> > isoProductAllocations) { var workingDatas = new List <WorkingData>(); //Set orders on the collection of DLVs var allDLVs = time.DataLogValues; for (int order = 0; order < allDLVs.Count(); order++) { var dlv = allDLVs.ElementAt(order); dlv.Order = order; } //Create vrProductIndex on relevant device elements if more than one product on this OperationData if (TimeLogMapper.GetDistinctProductIDs(TaskDataMapper, isoProductAllocations).Count > 1 && isoProductAllocations.Keys.Contains(isoDeviceElementHierarchy.DeviceElement.DeviceElementId)) { WorkingData workingData = CreateProductIndexWorkingData(deviceElementUse.Id.ReferenceId); ISODeviceElementIDsByWorkingDataID.Add(workingData.Id.ReferenceId, isoDeviceElementHierarchy.DeviceElement.DeviceElementId); workingDatas.Add(workingData); } //Add the Working Datas for this DeviceElement IEnumerable <ISODataLogValue> deviceElementDLVs = allDLVs.Where(dlv => dlv.DeviceElementIdRef == isoDeviceElementHierarchy.DeviceElement.DeviceElementId); foreach (ISODataLogValue dlv in deviceElementDLVs) { IEnumerable <WorkingData> newWorkingDatas = Map(dlv, isoSpatialRows, deviceElementUse, dlv.Order, pendingDeviceElementUses, isoDeviceElementHierarchy); if (newWorkingDatas.Count() > 0) { int ddi = dlv.ProcessDataDDI.AsInt32DDI(); if (!EnumeratedMeterFactory.IsCondensedMeter(ddi)) { //We skip adding Condensed WorkingDatas to this DeviceElementUse since they were added separately below to their specific DeviceElementUse workingDatas.AddRange(newWorkingDatas); } } } return(workingDatas); }
private void SetNumericMeterValue(ISOSpatialRow isoSpatialRow, NumericWorkingData meter, SpatialRecord spatialRecord, Dictionary <string, List <ISOProductAllocation> > productAllocations) { var isoValue = isoSpatialRow.SpatialValues.FirstOrDefault(v => v.DataLogValue.ProcessDataDDI != "DFFE" && _workingDataMapper.DataLogValuesByWorkingDataID.ContainsKey(meter.Id.ReferenceId) && v.DataLogValue.DeviceElementIdRef == _workingDataMapper.DataLogValuesByWorkingDataID[meter.Id.ReferenceId].DeviceElementIdRef && v.DataLogValue.ProcessDataDDI == _workingDataMapper.DataLogValuesByWorkingDataID[meter.Id.ReferenceId].ProcessDataDDI); if (isoValue != null) { var value = new NumericRepresentationValue(meter.Representation as NumericRepresentation, meter.UnitOfMeasure, new NumericValue(meter.UnitOfMeasure, isoValue.Value)); spatialRecord.SetMeterValue(meter, value); var other = new NumericRepresentationValue(meter.Representation as NumericRepresentation, meter.UnitOfMeasure, new NumericValue(meter.UnitOfMeasure, isoValue.Value)); _representationValueInterpolator.SetMostRecentMeterValue(meter, other); } else if (meter.Representation.Code == "vrProductIndex") { string detID = _workingDataMapper.ISODeviceElementIDsByWorkingDataID[meter.Id.ReferenceId]; if (productAllocations.ContainsKey(detID)) //The DeviceElement for this meter exists in the list of allocations { double numericValue = 0d; if (productAllocations[detID].Count == 1 || TimeLogMapper.GetDistinctProductIDs(_taskDataMapper, productAllocations).Count == 1) { //This product is consistent throughout the task on this device element int?adaptProductID = _taskDataMapper.InstanceIDMap.GetADAPTID(productAllocations[detID].Single().ProductIdRef); numericValue = adaptProductID.HasValue ? adaptProductID.Value : 0d; } else if (productAllocations[detID].Count > 1) { //There are multiple product allocations for the device element //Find the product allocation that governs this timestamp ISOProductAllocation relevantPan = productAllocations[detID].FirstOrDefault(p => Offset(p.AllocationStamp.Start) <= spatialRecord.Timestamp && (p.AllocationStamp.Stop == null || Offset(p.AllocationStamp.Stop) >= spatialRecord.Timestamp)); if (relevantPan != null) { int?adaptProductID = _taskDataMapper.InstanceIDMap.GetADAPTID(relevantPan.ProductIdRef); numericValue = adaptProductID.HasValue ? adaptProductID.Value : 0d; } } var value = new NumericRepresentationValue(meter.Representation as NumericRepresentation, meter.UnitOfMeasure, new NumericValue(meter.UnitOfMeasure, numericValue)); spatialRecord.SetMeterValue(meter, value); } } else { var value = _representationValueInterpolator.Interpolate(meter) as NumericRepresentationValue; spatialRecord.SetMeterValue(meter, value); } }
public List <WorkingData> Map(ISOTime time, IEnumerable <ISOSpatialRow> isoSpatialRows, DeviceElementUse deviceElementUse, DeviceHierarchyElement isoDeviceElementHierarchy, List <DeviceElementUse> pendingDeviceElementUses, Dictionary <string, List <ISOProductAllocation> > isoProductAllocations) { var workingDatas = new List <WorkingData>(); //Create vrProductIndex on relevant device elements if more than one product on this OperationData if (TimeLogMapper.GetDistinctProductIDs(TaskDataMapper, isoProductAllocations).Count > 1 && isoProductAllocations.Keys.Contains(isoDeviceElementHierarchy.DeviceElement.DeviceElementId)) { WorkingData workingData = CreateProductIndexWorkingData(deviceElementUse.Id.ReferenceId); ISODeviceElementIDsByWorkingDataID.Add(workingData.Id.ReferenceId, isoDeviceElementHierarchy.DeviceElement.DeviceElementId); workingDatas.Add(workingData); } //Add the Working Datas for this DeviceElement IEnumerable <ISODataLogValue> deviceElementDLVs = time.DataLogValues.Where(dlv => dlv.DeviceElementIdRef == isoDeviceElementHierarchy.DeviceElement.DeviceElementId || //DLV DET reference matches the primary DET for the ADAPT element isoDeviceElementHierarchy.MergedElements.Any(e => e.DeviceElementId == dlv.DeviceElementIdRef)); //DLV DET reference matches one of the merged DETs on the ADAPT element foreach (ISODataLogValue dlv in deviceElementDLVs) { IEnumerable <WorkingData> newWorkingDatas = Map(dlv, isoSpatialRows, deviceElementUse, dlv.Index, pendingDeviceElementUses, isoDeviceElementHierarchy); if (newWorkingDatas.Count() > 0) { int ddi = dlv.ProcessDataDDI.AsInt32DDI(); if (!EnumeratedMeterFactory.IsCondensedMeter(ddi)) { //We skip adding Condensed WorkingDatas to this DeviceElementUse since they were added separately below to their specific DeviceElementUse workingDatas.AddRange(newWorkingDatas); } } } return(workingDatas); }
private LoggedData ImportLoggedData(ISOTask isoLoggedTask) { LoggedData loggedData = new LoggedData(); loggedData.OperationData = new List <OperationData>(); //Task ID if (!ImportIDs(loggedData.Id, isoLoggedTask.TaskID)) { //In the case where a TSK contains both TZN and TLG data, we'll store the LoggedData as the mapped Task. //The Prescription ID will be assigned to the OperationData objects by means of the dictionary in this class. TaskDataMapper.InstanceIDMap.ReplaceADAPTID(isoLoggedTask.TaskID, loggedData.Id.ReferenceId); } //Task Name loggedData.Description = isoLoggedTask.TaskDesignator; //Grower ID loggedData.GrowerId = TaskDataMapper.InstanceIDMap.GetADAPTID(isoLoggedTask.CustomerIdRef); //Farm ID loggedData.FarmId = TaskDataMapper.InstanceIDMap.GetADAPTID(isoLoggedTask.FarmIdRef); //Field ID int?pfdID = TaskDataMapper.InstanceIDMap.GetADAPTID(isoLoggedTask.PartFieldIdRef); if (pfdID.HasValue) { if (DataModel.Catalog.CropZones.Any(c => c.Id.ReferenceId == pfdID.Value)) { loggedData.CropZoneId = pfdID.Value; } else { loggedData.FieldId = pfdID.Value; if (DataModel.Catalog.CropZones.Count(c => c.FieldId == pfdID) == 1) { //There is a single cropZone for the field. loggedData.CropZoneId = DataModel.Catalog.CropZones.Single(c => c.FieldId == pfdID).Id.ReferenceId; } } } //Responsible Worker if (!string.IsNullOrEmpty(isoLoggedTask.ResponsibleWorkerIdRef)) { ISOWorker worker = ISOTaskData.ChildElements.OfType <ISOWorker>().FirstOrDefault(w => w.WorkerId == isoLoggedTask.ResponsibleWorkerIdRef); int? personID = TaskDataMapper.InstanceIDMap.GetADAPTID(isoLoggedTask.ResponsibleWorkerIdRef); if (personID.HasValue) { //Create a Role PersonRole role = new PersonRole() { PersonId = personID.Value }; //Add to Catalog DataModel.Catalog.PersonRoles.Add(role); if (loggedData.PersonRoleIds == null) { loggedData.PersonRoleIds = new List <int>(); } //Add to Task loggedData.PersonRoleIds.Add(role.Id.ReferenceId); } } //Worker Allocations if (isoLoggedTask.WorkerAllocations.Any()) { WorkerAllocationMapper wanMapper = new WorkerAllocationMapper(TaskDataMapper); List <PersonRole> personRoles = wanMapper.ImportWorkerAllocations(isoLoggedTask.WorkerAllocations).ToList(); //Add to Catalog DataModel.Catalog.PersonRoles.AddRange(personRoles); if (loggedData.PersonRoleIds == null) { loggedData.PersonRoleIds = new List <int>(); } //Add to Task loggedData.PersonRoleIds.AddRange(personRoles.Select(p => p.Id.ReferenceId)); } //Guidance Allocations if (isoLoggedTask.GuidanceAllocations.Any()) { GuidanceAllocationMapper ganMapper = new GuidanceAllocationMapper(TaskDataMapper); List <GuidanceAllocation> allocations = ganMapper.ImportGuidanceAllocations(isoLoggedTask.GuidanceAllocations).ToList(); //Add to Catalog List <GuidanceAllocation> guidanceAllocations = DataModel.Documents.GuidanceAllocations as List <GuidanceAllocation>; if (guidanceAllocations != null) { guidanceAllocations.AddRange(allocations); } //Add to Task if (loggedData.GuidanceAllocationIds == null) { loggedData.GuidanceAllocationIds = new List <int>(); } loggedData.GuidanceAllocationIds.AddRange(allocations.Select(p => p.Id.ReferenceId)); } //Comments if (isoLoggedTask.CommentAllocations.Any()) { CommentAllocationMapper canMapper = new CommentAllocationMapper(TaskDataMapper); loggedData.Notes = canMapper.ImportCommentAllocations(isoLoggedTask.CommentAllocations).ToList(); } //Summaries if (isoLoggedTask.Times.Any(t => t.HasStart && t.HasType)) //Nothing added without a Start & Type attribute { //An ADAPT LoggedData has exactly one summary. This is what necessitates that ISO Task maps to LoggedData and ISO TimeLog maps to one or more Operation Data objects Summary summary = ImportSummary(isoLoggedTask, loggedData); if (DataModel.Documents.Summaries == null) { DataModel.Documents.Summaries = new List <Summary>(); } (DataModel.Documents.Summaries as List <Summary>).Add(summary); loggedData.SummaryId = summary.Id.ReferenceId; } //Operation Data if (isoLoggedTask.TimeLogs.Any()) { //Find ID for any Prescription that may also be tied to this task int?rxID = null; if (_rxIDsByTask.ContainsKey(isoLoggedTask.TaskID)) { rxID = _rxIDsByTask[isoLoggedTask.TaskID]; } loggedData.OperationData = TimeLogMapper.ImportTimeLogs(isoLoggedTask, rxID); } //Connections if (isoLoggedTask.Connections.Any()) { IEnumerable <EquipmentConfiguration> equipConfigs = ConnectionMapper.ImportConnections(isoLoggedTask); loggedData.EquipmentConfigurationGroup = new EquipmentConfigurationGroup(); loggedData.EquipmentConfigurationGroup.EquipmentConfigurations = equipConfigs.ToList(); //Make a reference to the IDs on the OperationData foreach (OperationData operationData in loggedData.OperationData) { operationData.EquipmentConfigurationIds.AddRange(equipConfigs.Select(e => e.Id.ReferenceId)); } DataModel.Catalog.EquipmentConfigurations.AddRange(equipConfigs); } return(loggedData); }
private ISOTask Export(LoggedData loggedData) { ISOTask task = null; //Try to map to a pre-existing Work Item task where appropriate if (loggedData.OperationData.All(o => o.PrescriptionId.HasValue) && loggedData.OperationData.Select(o => o.PrescriptionId.Value).Distinct().Count() == 1) { int rxID = loggedData.OperationData.First().PrescriptionId.Value; if (_taskIDsByPrescription.ContainsKey(rxID)) { task = ISOTaskData.ChildElements.OfType <ISOTask>().FirstOrDefault(t => t.TaskID == _taskIDsByPrescription[rxID]); } } if (task == null) { task = new ISOTask(); //Task ID string taskID = loggedData.Id.FindIsoId() ?? GenerateId(); task.TaskID = taskID; } if (!ExportIDs(loggedData.Id, task.TaskID)) { //Update the mapping to represent the completed task TaskDataMapper.InstanceIDMap.ReplaceADAPTID(task.TaskID, loggedData.Id.ReferenceId); } //Task Designator task.TaskDesignator = loggedData.Description; //Customer Ref if (loggedData.GrowerId.HasValue) { task.CustomerIdRef = TaskDataMapper.InstanceIDMap.GetISOID(loggedData.GrowerId.Value); } //Farm Ref if (loggedData.FarmId.HasValue) { task.FarmIdRef = TaskDataMapper.InstanceIDMap.GetISOID(loggedData.FarmId.Value); } //Partfield Ref if (loggedData.CropZoneId.HasValue) { task.PartFieldIdRef = TaskDataMapper.InstanceIDMap.GetISOID(loggedData.CropZoneId.Value); } else if (loggedData.FieldId.HasValue) { task.PartFieldIdRef = TaskDataMapper.InstanceIDMap.GetISOID(loggedData.FieldId.Value); } //Status task.TaskStatus = ISOEnumerations.ISOTaskStatus.Completed; if (loggedData.OperationData.Any()) { //Time Logs task.TimeLogs = TimeLogMapper.ExportTimeLogs(loggedData.OperationData, TaskDataPath).ToList(); //Connections IEnumerable <int> taskEquipmentConfigIDs = loggedData.OperationData.SelectMany(o => o.EquipmentConfigurationIds); if (taskEquipmentConfigIDs.Any()) { IEnumerable <EquipmentConfiguration> taskEquipmentConfigs = DataModel.Catalog.EquipmentConfigurations.Where(d => taskEquipmentConfigIDs.Contains(d.Id.ReferenceId)); task.Connections = ConnectionMapper.ExportConnections(loggedData.Id.ReferenceId, taskEquipmentConfigs).ToList(); } } //Summaries if (loggedData.SummaryId.HasValue) { Summary summary = DataModel.Documents.Summaries.FirstOrDefault(s => s.Id.ReferenceId == loggedData.SummaryId.Value); if (summary != null) { task.Times.AddRange(ExportSummary(summary)); } List <ISOProductAllocation> productAllocations = GetProductAllocationsForSummary(summary); if (productAllocations != null) { task.ProductAllocations.AddRange(productAllocations); } } //Comments if (loggedData.Notes.Any()) { CommentAllocationMapper canMapper = new CommentAllocationMapper(TaskDataMapper); task.CommentAllocations = canMapper.ExportCommentAllocations(loggedData.Notes).ToList(); } //Worker Allocations if (loggedData.PersonRoleIds.Any()) { WorkerAllocationMapper workerAllocationMapper = new WorkerAllocationMapper(TaskDataMapper); List <PersonRole> personRoles = new List <PersonRole>(); foreach (int id in loggedData.PersonRoleIds) { PersonRole personRole = DataModel.Catalog.PersonRoles.FirstOrDefault(p => p.Id.ReferenceId == id); if (personRole != null) { personRoles.Add(personRole); } } task.WorkerAllocations = workerAllocationMapper.ExportWorkerAllocations(personRoles).ToList(); } //Guidance Allocations if (loggedData.GuidanceAllocationIds.Any()) { GuidanceAllocationMapper guidanceAllocationMapper = new GuidanceAllocationMapper(TaskDataMapper); List <GuidanceAllocation> allocations = new List <GuidanceAllocation>(); foreach (int id in loggedData.GuidanceAllocationIds) { GuidanceAllocation allocation = DataModel.Documents.GuidanceAllocations.FirstOrDefault(p => p.Id.ReferenceId == id); if (allocation != null) { allocations.Add(allocation); } } task.GuidanceAllocations = guidanceAllocationMapper.ExportGuidanceAllocations(allocations).ToList(); } return(task); }
private void SetNumericMeterValue(ISOSpatialRow isoSpatialRow, NumericWorkingData meter, SpatialRecord spatialRecord, Dictionary <string, List <ISOProductAllocation> > productAllocations) { var dataLogValue = _workingDataMapper.DataLogValuesByWorkingDataID.ContainsKey(meter.Id.ReferenceId) ? _workingDataMapper.DataLogValuesByWorkingDataID[meter.Id.ReferenceId] : null; var isoValue = dataLogValue != null ? isoSpatialRow.SpatialValues.FirstOrDefault(v => v.DataLogValue.ProcessDataDDI != "DFFE" && v.DataLogValue.DeviceElementIdRef == dataLogValue.DeviceElementIdRef && v.DataLogValue.ProcessDataDDI == dataLogValue.ProcessDataDDI) : null; if (isoValue != null) { ADAPT.ApplicationDataModel.Common.UnitOfMeasure userProvidedUnitOfMeasure = meter.UnitOfMeasure; //Default; no display uom provided. var dvp = isoValue.DeviceProcessData?.DeviceValuePresentation; if (dvp != null) { //If a DVP element is present, report out the desired display unit of measure as the UserProvidedUnitOfMeasure. //This will not necessarily map to the Representation.UnitSystem. userProvidedUnitOfMeasure = new ApplicationDataModel.Common.UnitOfMeasure() { Code = dvp.UnitDesignator, Scale = dvp.Scale, Offset = dvp.Offset }; } var value = new NumericRepresentationValue(meter.Representation as NumericRepresentation, userProvidedUnitOfMeasure, new NumericValue(meter.UnitOfMeasure, isoValue.Value)); spatialRecord.SetMeterValue(meter, value); var other = new NumericRepresentationValue(meter.Representation as NumericRepresentation, userProvidedUnitOfMeasure, new NumericValue(meter.UnitOfMeasure, isoValue.Value)); _representationValueInterpolator.SetMostRecentMeterValue(meter, other); } else if (meter.Representation.Code == "vrProductIndex") { string detID = _workingDataMapper.ISODeviceElementIDsByWorkingDataID[meter.Id.ReferenceId]; if (productAllocations.ContainsKey(detID)) //The DeviceElement for this meter exists in the list of allocations { var productAllocationsForDeviceElement = productAllocations[detID]; double numericValue = 0d; if (productAllocationsForDeviceElement.Count == 1 || TimeLogMapper.GetDistinctProductIDs(_taskDataMapper, productAllocations).Count == 1) { //This product is consistent throughout the task on this device element int?adaptProductID = _taskDataMapper.InstanceIDMap.GetADAPTID(productAllocationsForDeviceElement.Single().ProductIdRef); numericValue = adaptProductID.HasValue ? adaptProductID.Value : 0d; } else if (productAllocationsForDeviceElement.Count > 1) { //There are multiple product allocations for the device element //Find the product allocation that governs this timestamp ISOProductAllocation relevantPan = productAllocationsForDeviceElement.FirstOrDefault(p => Offset(p.AllocationStamp.Start) <= spatialRecord.Timestamp && (p.AllocationStamp.Stop == null || Offset(p.AllocationStamp.Stop) >= spatialRecord.Timestamp)); if (relevantPan == null) { //We couldn't correlate strictly based on time. Check for a more general match on date alone before returning null. var pansMatchingDate = productAllocationsForDeviceElement.Where(p => p.AllocationStamp.Start?.Date == p.AllocationStamp.Stop?.Date && p.AllocationStamp.Start?.Date == spatialRecord.Timestamp.Date); if (pansMatchingDate.Count() == 1) { //Only one PAN on this date, use it. relevantPan = pansMatchingDate.Single(); } } if (relevantPan != null) { int?adaptProductID = _taskDataMapper.InstanceIDMap.GetADAPTID(relevantPan.ProductIdRef); numericValue = adaptProductID.HasValue ? adaptProductID.Value : 0d; } } var value = new NumericRepresentationValue(meter.Representation as NumericRepresentation, meter.UnitOfMeasure, new NumericValue(meter.UnitOfMeasure, numericValue)); spatialRecord.SetMeterValue(meter, value); } } else { var value = _representationValueInterpolator.Interpolate(meter) as NumericRepresentationValue; spatialRecord.SetMeterValue(meter, value); } }