private SyncXMLDataObject GetXMLDataObjInChangedItem(IChangedItem item) { SyncXMLDataObject obj = null; var itemType = item.GetType(); var objProperties = itemType.GetProperties(); foreach (var property in objProperties) { if (property.GetCustomAttribute <XMLDataFieldType>() != null) { obj = property.GetValue(item) as SyncXMLDataObject; if (obj != null) { break; } } } return(obj); }
/// <summary> /// Обработка объекта /// </summary> /// <param name="obj">объект, который пришел</param> /// <param name="state">тип изменения, входящего объекта</param> /// <param name="type">тип объекта, в который преобразуем</param> /// <param name="mapper">маппер для преобразования</param> /// <param name="attrs">список изменяемых свойств</param> /// <param name="source">Источник изменений</param> /// <param name="arrToUpd">Список обновляемых объектов данных</param> /// <param name="arrConformity">Список обновляемых объектов синхронизации</param> private void ProcessObject(SyncXMLDataObject obj, tState state, Type type, IPropertyMapperWithChangedAttrs mapper, List <string> attrs, Source source, ref List <DataObject> arrToUpd, ref Dictionary <string, List <DataObject> > arrConformity) { if (obj == null) { return; } var view = mapper.GetView(); var nameType = type.FullName; var otype = arrConformity[sObjectType].Cast <ObjectType>().FirstOrDefault(x => x.name == nameType) ?? _syncDS.Query <ObjectType>(ObjectType.Views.ObjectTypeE) .FirstOrDefault(x => x.name == nameType) ?? new ObjectType { name = nameType, id = type.Name }; if (otype.GetStatus() == ObjectStatus.Created) { arrConformity[sObjectType].Add(otype); } Conformity conformity = null; if (otype.GetStatus() != ObjectStatus.Created && source.GetStatus() != ObjectStatus.Created) { conformity = _syncDS.Query <Conformity>(Conformity.Views.ConformityE).FirstOrDefault(x => x.Source.__PrimaryKey.Equals(source.__PrimaryKey) && x.Type.__PrimaryKey.Equals(otype.__PrimaryKey) && x.pkSource.Equals(obj.Guid)); } if (state != tState.deleted) //создание/изменение { DataObject dest = null; if (conformity != null) //ищем по pk { dest = GetDataObject(type, view, conformity.pkDest); } else { dest = GetDataObject(type, view, obj.Guid); } if (dest == null) //ищем по альтернативному ключу { var queryAlt = mapper.GetAltKey(obj, _defDS, _syncDS, source, ref arrToUpd, ref arrConformity); dest = queryAlt?.FirstOrDefault(); if (queryAlt != null && dest != null) { LogService.LogInfo($"BusMessageHandlerService: Удалось найти объект(pk-{obj.Guid}) по альтернативному ключу для типа {nameType}. Сопоставленный объект объект(pk-{dest.__PrimaryKey})"); } } if (dest == null) { dest = (DataObject)Activator.CreateInstance(type); } dest.GetStatus(); dest = mapper.Map(obj, dest, attrs); // Проверяем было ли помещено создание объекта на апдейт. Если да, то такой объект уже считается существующим и статус нового объекта с таким же ключом меняется на Altered. var alreadyExistsCreatedObj = arrToUpd.Exists(x => PKHelper.EQPK(x, dest) && x.GetStatus(false) == ObjectStatus.Created); if (alreadyExistsCreatedObj) { dest.SetLoadingState(LoadingState.Loaded); dest.SetStatus(ObjectStatus.Altered); } arrToUpd.Add(dest); //заполнение мастеров/////////////////////////////////////////////////////////////////////////////// mapper.SetMasters(obj, dest, attrs, _defDS, _syncDS, source, ref arrToUpd, ref arrConformity); if (conformity == null) { conformity = new Conformity { Source = source, Type = otype, pkSource = obj.Guid, pkDest = new Guid(dest.__PrimaryKey.ToString()) }; arrConformity[sConformity].Add(conformity); } } else //удаление { if (conformity != null) { var count = _syncDS.Query <Conformity>(Conformity.Views.ConformityE).Count(x => x.Type.__PrimaryKey.Equals(otype.__PrimaryKey) && x.pkDest.Equals(conformity.pkDest)); if (count >= 1) { conformity.SetStatus(ObjectStatus.Deleted); arrConformity[sConformity].Add(conformity); } if (count == 1) { var dest = GetDataObject(type, view, conformity.pkDest); if (dest != null) { dest.SetStatus(ObjectStatus.Deleted); arrToUpd.Add(dest); } } } } }