Esempio n. 1
0
        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);
        }
Esempio n. 2
0
        /// <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);
                        }
                    }
                }
            }
        }