Exemplo n.º 1
0
        /// <summary>
        ///     Получить настройки по входящему типу.
        /// </summary>
        /// <param name="source">входящий объект</param>
        /// <param name="destType">Тип объекта, который был изменён.</param>
        /// <param name="mapper">Маппер для объекта, который был изменён.</param>
        private void GetSyncSettings(ISync source, out Type destType, out IPropertyMapperWithChangedAttrs mapper)
        {
            SyncSetting setting = null;

            destType = null;
            mapper   = null;
            if (source == null)
            {
                throw new ArgumentNullException(nameof(source));
            }

            try
            {
                setting  = SettingService.Current.GetSettings(source).First();
                destType = setting.Destination.ExtractType();
                mapper   = setting.ExtractMapper <IPropertyMapperWithChangedAttrs>();
            }
            catch (Exception ex)
            {
                var text = "Ошибка: не удалось";
                if (setting == null)
                {
                    text = $"{text} загрузить настройки SyncSettings для входящего типа = {source.GetType().FullName}.";
                }
                else if (destType == null)
                {
                    text = $"{text} получить исходящий тип из настройки SyncSettings.PK - {setting.__PrimaryKey}.";
                }
                else if (mapper == null)
                {
                    text = $"{text} получить маппер из настройки SyncSettings.PK - {setting.__PrimaryKey}.";
                }

                throw new Exception($"{text}{Environment.NewLine}{ex.Message}");
            }
        }
Exemplo 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);
                        }
                    }
                }
            }
        }