private static Guid AddItemToRegestry(this CardData self, CardData refUniversal)
        {
            var sdp = self.Sections[CardOrd.Properties.ID];

            RowData rtd = refUniversal.Sections[RefUniversal.ItemType.ID]
                          .FindRow("@Name='Справочник готовых приборов'");

            SubSectionData items        = rtd.ChildSections[refUniversal.Type.AllSections["Item"].Id];
            SubSectionData propertyItem = rtd.ChildSections[refUniversal.Type.AllSections["TypeProperties"].Id];

            // Свойства записи
            RowData partyProperty         = propertyItem.FindRow("@Name='Партия'");
            RowData statusProperty        = propertyItem.FindRow("@Name='Статус'");
            RowData unitYearProperty      = propertyItem.FindRow("@Name='Год прибора'");
            RowData unitNumberProperty    = propertyItem.FindRow("@Name='Номер прибора'");
            RowData unitPassportProperty  = propertyItem.FindRow("@Name='Паспорт прибора'");
            RowData warrantyTalonProperty = propertyItem.FindRow("@Name='Гарантийный талон'");
            RowData unitNameProperty      = propertyItem.FindRow("@Name='Наименование прибора'");

            // Свойства карточки
            RowData unit       = sdp.FindRow("@Name='Прибор'");
            RowData party      = sdp.FindRow("@Name='№ партии'");
            RowData unitYear   = sdp.FindRow(string.Format("@Name = '{0}'", "/Год прибора"));
            RowData unitNumber = sdp.FindRow("@Name='Заводской номер прибора'");

            // Создаем запись в справочнике готовых приборов
            RowData newItem = items.Rows.AddNew();

            newItem.SetString("Name", self.Description);
            SubSectionData subrow = newItem.ChildSections[refUniversal.Type.AllSections["Properties"].Id];

            // Прописываем свойства
            AddItem(subrow.Rows.AddNew(),
                    unitNumberProperty.GetString("RowID"), unitNumber.GetString("DisplayValue"), unitNumber.GetString("Value"));
            AddItem(subrow.Rows.AddNew(),
                    unitYearProperty.GetString("RowID"), unitYear.GetString("DisplayValue"), unitYear.GetString("Value"));
            AddItem(subrow.Rows.AddNew(),
                    partyProperty.GetString("RowID"), party.GetString("DisplayValue"), party.GetString("Value"));
            AddItem(subrow.Rows.AddNew(),
                    statusProperty.GetString("RowID"), "В эксплуатации", "6");
            AddItem(subrow.Rows.AddNew(),
                    unitNameProperty.GetString("RowID"), unit.GetString("DisplayValue"), unit.GetString("Value"));
            AddItem(subrow.Rows.AddNew(),
                    unitPassportProperty.GetString("RowID"), self.Description, self.Id.ToString());
            AddItem(subrow.Rows.AddNew(),
                    unitNumber.GetString("RowID"), self.Description, self.Id.ToString());
            AddItem(subrow.Rows.AddNew(),
                    warrantyTalonProperty.GetString("RowID"), "", "");
            return(newItem.Id);
        }
Exemplo n.º 2
0
        public static Boolean Synchronize(UserSession Session, String CardID)
        {
            logger.Info("cardId='{0}'", CardID);
            using (new Impersonator(ServerExtension.Domain, ServerExtension.User, ServerExtension.SecurePassword))
            {
                Guid CardId = new Guid(CardID);
                switch (Session.CardManager.GetCardState(CardId))
                {
                case ObjectState.Existing:
                    CardData Card = Session.CardManager.GetCardData(CardId);

                    Card.UnlockCard();

                    ExtraCard Extra = Card.GetExtraCard();
                    if (Extra.IsNull())
                    {
                        logger.Info("Синхронизация не производилась, неверный тип карточки.");
                        return(false);
                    }

                    if (String.IsNullOrEmpty(Extra.Name) || String.IsNullOrEmpty(Extra.ShortCategory) || (String.IsNullOrEmpty(Extra.Code) && !(Extra is ExtraCardMarketingFiles)))
                    {
                        logger.Info("Синхронизация не производилась, не заполнены обязательные поля.");
                        return(false);
                    }


                    String  Digest    = Extra.ToString();
                    Boolean FileSynch = false;

                    /*Синхронизация с реестром только для КД и ТД*/
                    if (Extra is ExtraCardCD || Extra is ExtraCardTD)
                    {
                        Guid RegItemId = Extra.RegID ?? Guid.Empty;
                        if (RegItemId != Guid.Empty)
                        {
                            try
                            {
                                RowData RegItem = Session.CardManager.GetDictionaryData(RefUniversal.ID).Sections[RefUniversal.Item.ID].GetRow(RegItemId);
                                if (RegItem.GetString(RefUniversal.Item.Name) != Digest)
                                {
                                    logger.Info("Требуется синхронизация...");
                                    RegItem.SetString(RefUniversal.Item.Name, Digest);
                                    foreach (RowData rowData in RegItem.ChildSections[0].Rows)
                                    {
                                        String PropertyName = rowData.GetString(RefUniversal.TypeProperties.Name);
                                        if ((PropertyName == "Код СКБ" && Extra is ExtraCardCD) || (PropertyName == "Обозначение документа" && Extra is ExtraCardTD))
                                        {
                                            rowData.SetString(RefUniversal.TypeProperties.Value, Extra.CodeId);
                                            rowData.SetString(RefUniversal.TypeProperties.DisplayValue, Extra.Code);
                                        }
                                        else if (PropertyName == "Тип документа")
                                        {
                                            rowData.SetString(RefUniversal.TypeProperties.Value, Extra.Category);
                                            rowData.SetString(RefUniversal.TypeProperties.DisplayValue, Extra.Category);
                                        }
                                        else if (PropertyName == "Версия")
                                        {
                                            rowData.SetString(RefUniversal.TypeProperties.Value, Extra.Version);
                                            rowData.SetString(RefUniversal.TypeProperties.DisplayValue, Extra.Version);
                                        }
                                    }
                                    logger.Info("Синхронизация с реестром выполнена.");
                                    FileSynch = true;
                                }
                                else
                                {
                                    logger.Info("Синхронизация не требуется.");
                                }
                            }
                            catch (Exception Ex) { logger.WarnException("Не удалось синхронизировать с записью реестра: " + RegItemId, Ex); }
                        }
                        else
                        {
                            logger.Info("Регистрация в реестре");
                            RowData RegisterRow = Session.CardManager.GetDictionaryData(RefUniversal.ID).GetItemTypeRow(MyHelper.RefItem_TechDocRegister);

                            SubSectionData RegisterTypeProperties = RegisterRow.ChildSections[RefUniversal.TypeProperties.ID];

                            RowData RegistrarUnit = Card.Sections[CardOrd.Properties.ID].GetProperty("Подразделение регистратора");
                            RowData Device        = Card.Sections[CardOrd.Properties.ID].GetProperty("Прибор");

                            RowData RegItem = RegisterRow.ChildSections[RefUniversal.Item.ID].Rows.AddNew();
                            RegItem.SetString(RefUniversal.Item.Name, Card.Description);
                            RegItem.SetString(RefUniversal.Item.Comments, Extra.Number);

                            RowDataCollection PropertiesSubSectionRows = RegItem.ChildSections[RefUniversal.Properties.ID].Rows;
                            RowData           ItemPropertyRow          = PropertiesSubSectionRows.AddNew();
                            ItemPropertyRow.SetGuid(RefUniversal.Properties.Property, RegisterTypeProperties.FindRow("@Name='" + (Extra is ExtraCardCD ? "Код СКБ" : "Обозначение документа") + "'").Id);
                            ItemPropertyRow.SetString(RefUniversal.Properties.DisplayValue, Extra.Code);
                            ItemPropertyRow.SetValue(RefUniversal.Properties.Value, Extra.CodeId, FieldType.Variant);
                            ItemPropertyRow = PropertiesSubSectionRows.AddNew();
                            ItemPropertyRow.SetGuid(RefUniversal.Properties.Property, RegisterTypeProperties.FindRow("@Name='Тип документа'").Id);
                            ItemPropertyRow.SetString(RefUniversal.Properties.DisplayValue, Extra.Category);
                            ItemPropertyRow.SetValue(RefUniversal.Properties.Value, Extra.Category, FieldType.Variant);
                            ItemPropertyRow = PropertiesSubSectionRows.AddNew();
                            ItemPropertyRow.SetGuid(RefUniversal.Properties.Property, RegisterTypeProperties.FindRow("@Name='Версия'").Id);
                            ItemPropertyRow.SetString(RefUniversal.Properties.DisplayValue, Extra.Version);
                            ItemPropertyRow.SetValue(RefUniversal.Properties.Value, Extra.Version, FieldType.Variant);
                            ItemPropertyRow = PropertiesSubSectionRows.AddNew();
                            ItemPropertyRow.SetGuid(RefUniversal.Properties.Property, RegisterTypeProperties.FindRow("@Name='Статус'").Id);
                            ItemPropertyRow.SetString(RefUniversal.Properties.DisplayValue, ((DocumentState)Extra.Status).GetDescription());
                            ItemPropertyRow.SetValue(RefUniversal.Properties.Value, (Int32)(DocumentState)Extra.Status, FieldType.Variant);
                            ItemPropertyRow = PropertiesSubSectionRows.AddNew();
                            ItemPropertyRow.SetGuid(RefUniversal.Properties.Property, RegisterTypeProperties.FindRow("@Name='Подразделение регистратора'").Id);
                            ItemPropertyRow.SetString(RefUniversal.Properties.DisplayValue, RegistrarUnit.GetString(CardOrd.Properties.DisplayValue));
                            ItemPropertyRow.SetValue(RefUniversal.Properties.Value, RegistrarUnit.GetString(CardOrd.Properties.Value), FieldType.Variant);
                            ItemPropertyRow = PropertiesSubSectionRows.AddNew();
                            ItemPropertyRow.SetGuid(RefUniversal.Properties.Property, RegisterTypeProperties.FindRow("@Name='Прибор'").Id);
                            ItemPropertyRow.SetString(RefUniversal.Properties.DisplayValue, Device.GetString(CardOrd.Properties.DisplayValue));
                            ItemPropertyRow.SetValue(RefUniversal.Properties.Value, Device.ChildSections[CardOrd.SelectedValues.ID].FirstRow.GetString(CardOrd.SelectedValues.SelectedValue), FieldType.Variant);
                            ItemPropertyRow = PropertiesSubSectionRows.AddNew();
                            ItemPropertyRow.SetGuid(RefUniversal.Properties.Property, RegisterTypeProperties.FindRow("@Name='Ссылка на карточку документа'").Id);
                            ItemPropertyRow.SetString(RefUniversal.Properties.DisplayValue, Extra.Card.Description);
                            ItemPropertyRow.SetValue(RefUniversal.Properties.Value, Extra.Card.Id, FieldType.Variant);
                            ItemPropertyRow = PropertiesSubSectionRows.AddNew();
                            ItemPropertyRow.SetGuid(RefUniversal.Properties.Property, RegisterTypeProperties.FindRow("@Name='Файлы документа'").Id);
                            ItemPropertyRow.SetString(RefUniversal.Properties.DisplayValue, Extra.Path);
                            ItemPropertyRow.SetValue(RefUniversal.Properties.Value, Extra.Card.Id, FieldType.Variant);

                            Extra.RegID = RegItem.Id;
                            logger.Info("В реестр добавлена запись: " + Card.Description);
                        }
                    }
                    else
                    {
                        FileSynch = true;
                    }

                    if (FileSynch)
                    {
                        logger.Info("Синхронизация пути...");
                        String OldPath = Extra.Path;
                        logger.Info("Старый путь: " + OldPath);
                        String NewPath = String.Empty;
                        logger.Info("Новый путь: " + NewPath);
                        if (Directory.Exists(OldPath))
                        {
                            DirectoryInfo OldFolder    = new DirectoryInfo(OldPath);
                            DirectoryInfo ParentFolder = OldFolder.Parent;
                            if (ParentFolder != null)
                            {
                                logger.Info("Старый путь:" + OldPath);
                                NewPath = MyHelper.RemoveInvalidFileNameChars(Digest);
                                if (NewPath != Digest)
                                {
                                    logger.Info("Удалены недопустимые символы: " + Digest);
                                }
                                NewPath = Path.Combine(ParentFolder.FullName, NewPath);
                                String TempPath = Path.Combine(ParentFolder.FullName, Path.GetRandomFileName());
                                logger.Info("Временный путь:" + TempPath);
                                logger.Info("Новый путь:" + NewPath + @"\");
                                try
                                {
                                    logger.Info("Перемещение во временную папку");
                                    Directory.Move(OldPath, TempPath);
                                    try
                                    {
                                        logger.Info("Перемещение в новую папку");
                                        Directory.Move(TempPath, NewPath);
                                    }
                                    catch (Exception Ex)
                                    {
                                        logger.WarnException("Перемещение не удалось!", Ex);
                                        try
                                        {
                                            logger.Info("Перемещение в старую папку");
                                            Directory.Move(TempPath, OldPath);
                                        }
                                        catch (Exception SubEx)
                                        {
                                            logger.Warn("Перемещение не удалось!");
                                            logger.ErrorException("Перемещение не удалось!", SubEx);
                                            NewPath = String.Empty;
                                        }
                                    }
                                }
                                catch (Exception Ex)
                                {
                                    logger.WarnException("Перемещение не удалось!", Ex);
                                    NewPath = String.Empty;
                                }

                                if (!String.IsNullOrWhiteSpace(NewPath))
                                {
                                    if (!(Extra is ExtraCardMarketingFiles))
                                    {
                                        Extra.Path = NewPath + @"\";
                                    }
                                    logger.Info("Синхронизация пути выполнена");
                                }
                                else
                                {
                                    logger.Warn("Синхронизация пути не выполнена");
                                }
                            }
                            else
                            {
                                logger.Warn("Отсутствует родительская папка!");
                            }
                        }
                        else
                        {
                            logger.Info("Отсутствует путь для синхронизации!");
                        }
                    }
                    return(true);

                default:
                    return(false);
                }
            }
        }