///<summary>МЕТОД Инициализация отчета</summary> /// <param name="pNodes">Ветка</param> public override VirtualOtchet MET_Inizial(VirtualNodes pNodes) { // Если нужно формировать отчет if (PROP_NewCreate) { base.MET_Inizial(pNodes); // Список элементов PRO_PoleHistory = new Queue(); // Чистим Blocks.Clear(); // Формируем отчет MET_Otchet(); // Добавляем последний параграф в блок Blocks.Add(PRO_Paragraph); // Помечаем, что больше его формировать не надо PROP_NewCreate = false; // Если всего один отчет, то сразу же его показываем if (PRO_PoleHistory.Count == 1) { UserPole_History _Pole = (UserPole_History)PRO_PoleHistory.Peek(); // Окрываем эспандер _Pole.PROP_IsExpanded = true; } } return(this); }
/// <summary>МЕТОД Заполняем Протоколы</summary> /// <param name="pPole">Наше поле</param> public void MET_Protokol(UserPole_History pPole) { // Обязательно, если экспандер содержит текст, а не под-вкладки pPole.PROP_IsTexted = true; // Документ FlowDocument _FlowDocument = new FlowDocument(); _FlowDocument.Background = Brushes.White; // Просмоторщик pPole.PUB_RichTextBox = new RichTextBox(); RichTextBox _RichTextBox = pPole.PUB_RichTextBox; _RichTextBox.Document = _FlowDocument; // Добавляем документ в экспандер pPole.MET_AddEle(_RichTextBox); // Привязываем к полю Документ, таблицы ListShablon и Protokol, Отчет pPole.PROP_DocumHistory.PROP_ListShablon = UserListShablon.MET_FactoryListShablon(pPole.PROP_Type, pPole.PROP_NumerShablon); pPole.PROP_DocumHistory.PROP_Otchet = new UserOtchet_Shablon { PROP_Docum = pPole.PROP_DocumHistory }; // Добавляем отчет к документу _FlowDocument.Blocks.Add(pPole.PROP_DocumHistory.PROP_Otchet.MET_Inizial()); // Отключаем делегат pPole.Event_OpenNewPoleHistory = null; }
/// <summary>МЕТОД Заполняем экспандер при первом открытии Отчетов</summary> /// <param name="pPole">Наше поле</param> public virtual void MET_OpenOtch(UserPole_History pPole) { // Документ FlowDocument _FlowDocument = new FlowDocument(); // Просмоторщик pPole.PUB_RichTextBox = new RichTextBox(); RichTextBox _RichTextBox = pPole.PUB_RichTextBox; _RichTextBox.Document = _FlowDocument; // locRichTextBox.IsReadOnly = true; // Добавляем документ в экспандер pPole.MET_AddEle(_RichTextBox); PRO_Paragraph = new Paragraph(); // Создаем временный поток для копирования using (MemoryStream _Stream = new MemoryStream()) { // Выделяем область которую хотим копировать TextRange _TextRange = new TextRange(pPole.PROP_Nodes.PROP_Docum.PROP_Otchet.MET_Inizial(pPole.PROP_Nodes).ContentStart, pPole.PROP_Nodes.PROP_Docum.PROP_Otchet.MET_Inizial(pPole.PROP_Nodes).ContentEnd); // Копируем текст в поток _TextRange.Save(_Stream, DataFormats.Xaml); _Stream.Position = 0; // Новый пораграф (что бы был отступ между документами) _FlowDocument.Blocks.Add(new Paragraph()); // Выделяем концовку, куда хотим вставить текст _TextRange = new TextRange(_FlowDocument.ContentEnd, _FlowDocument.ContentEnd); // Вставляем текст в поток просмотра печати _TextRange.Load(_Stream, DataFormats.Xaml); } // Отключаем делегат pPole.Event_OpenNewPoleHistory = null; }
/// <summary>МЕТОД Создаем поле истории результата исседования КДЛ</summary> /// <param name="pPole">Родительское поле</param> private UserPole_History MET_GreatKDL(UserPole_History pPole) { // Заполняем список шаблонов MySql.MET_DsAdapterFill(MyQuery.MET_History_Select_4(MET_PoleInt("kdl")), "HistoryKDL"); PRO_RowShablon = MyGlo.DataSet.Tables["HistoryKDL"].Rows[0]; // Настраиваем поле документа UserPole_History _Pole = new UserPole_History(); _Pole.PROP_Date = MET_PoleDat("pDate"); _Pole.PROP_Document = MET_PoleStr("NameKr"); _Pole.PROP_Dp = MET_PoleDat("pDate"); _Pole.PROP_Kdl = MET_PoleStr("Indicator"); _Pole.PROP_Metca = " (" + _Pole.PROP_Kdl + ")"; _Pole.PROP_Background = Brushes.LightYellow; // Окрашиваем поле в зависимости от результата MET_ColorKDL(_Pole); _Pole.PROP_Type = eTipDocum.Kdl; _Pole.PROP_IsTexted = true; // Находим иконку string _Icon = MET_PoleStr("Icon") != "" ? MET_PoleStr("Icon") : "mnOneOsmotr"; _Pole.MET_LoadIcon(_Icon); _Pole.PROP_Cod = MET_PoleInt("Cod"); _Pole.PROP_CodApstac = pPole.PROP_CodApstac; _Pole.PROP_NumerShablon = MET_PoleInt("NumShablon"); _Pole.PROP_Kdl = "1"; _Pole.PROP_DocumHistory = new UserDocument(_Pole.PROP_Type); _Pole.PROP_IsDelete = MET_PoleInt("xDelete") == 1; _Pole.PROP_DocumHistory.PROP_Protokol = UserProtokol.MET_FactoryProtokol(_Pole.PROP_Type, (int)_Pole.PROP_Cod); _Pole.PROP_Vrach = _Pole.PROP_DocumHistory.PROP_Protokol.PROP_UserName; _Pole.MET_Inicial(); // Делегат при открытии документа _Pole.Event_OpenNewPoleHistory = MET_Protokol; return(_Pole); }
/// <summary>МЕТОД Заполняем экспандер при первом открытии Стационара</summary> /// <param name="pPole">Наше поле</param> private void MET_OpenStac(UserPole_History pPole) { // Заполняем список шаблонов MySql.MET_DsAdapterFill(MyQuery.MET_History_Select_2(pPole.PROP_Cod), "History"); foreach (DataRow _Row in MyGlo.DataSet.Tables["History"].Rows) { PRO_RowShablon = _Row; // Настраиваем поле документа UserPole_History _Pole = new UserPole_History(); _Pole.PROP_Date = MET_PoleDat("pDate"); _Pole.PROP_Document = MET_PoleStr("NameKr"); _Pole.PROP_Dp = MET_PoleDat("pDate"); _Pole.Margin = new Thickness(5, 0, 0, 0); _Pole.PROP_Background = Brushes.LightYellow; _Pole.PROP_Type = eTipDocum.Stac; _Pole.PROP_IsTexted = true; // Находим иконку string _Icon = MET_PoleStr("Icon") != "" ? MET_PoleStr("Icon") : "mnOneOsmotr"; _Pole.MET_LoadIcon(_Icon); _Pole.PROP_Cod = MET_PoleInt("Cod"); _Pole.PROP_CodApstac = pPole.PROP_CodApstac; _Pole.PROP_NumerShablon = MET_PoleInt("NumShablon"); _Pole.PROP_Kdl = MET_PoleStr("kdl"); _Pole.PROP_DocumHistory = new UserDocument(_Pole.PROP_Type); _Pole.PROP_DocumHistory.PROP_Protokol = UserProtokol.MET_FactoryProtokol(_Pole.PROP_Type, (int)_Pole.PROP_Cod); _Pole.PROP_Vrach = _Pole.PROP_DocumHistory.PROP_Protokol.PROP_UserName; _Pole.MET_Inicial(); // Делегат при открытии документа _Pole.Event_OpenNewPoleHistory = MET_Protokol; // Если запрет для просмотра if (PUB_Ban && MET_PoleInt("Dostup") == 0) { _Pole.PROP_Description = "(Доступ Закрыт) "; _Pole.PROP_Background = Brushes.GhostWhite; _Pole.IsEnabled = false; _Pole.Event_OpenNewPoleHistory = null; } _Pole.PROP_IsDelete = MET_PoleInt("xDelete") == 1; pPole.MET_AddEle(_Pole); if (_Pole.PROP_Kdl != "") { var _PoleKDL = MET_GreatKDL(_Pole); _PoleKDL.Margin = new Thickness(5, 0, 0, 0); // Добавляем в очередь pPole.MET_AddEle(_PoleKDL); } } // Отключаем делегат pPole.Event_OpenNewPoleHistory = null; }
/// <summary>МЕТОД Формируем отчет</summary> protected override void MET_Otchet() { PRO_Paragraph = new Paragraph(); // Перебераем дочерние ветки и выводим их MET_OtchVet(PROP_Nodes); // Сортировка, с помощью промежуточных массиввов UserPole_History[] _mHistories = new UserPole_History[PRO_PoleHistory.Count]; PRO_PoleHistory.CopyTo(_mHistories, 0); var _Protokols = _mHistories.OrderBy(x => Convert.ToDateTime(x.PROP_Dp)); //.ThenBy(x => x.PROP_NumerShablon); // Чистим очередь PRO_PoleHistory.Clear(); // Выводим протокол на экран и запоминаем его в очередь foreach (var _Protokol in _Protokols) { PRO_PoleHistory.Enqueue(_Protokol); PRO_Paragraph.Inlines.Add(_Protokol); } }
/// <summary>МЕТОД Формируем отчет</summary> /// <param name="pNode">Ветка</param> private void MET_OtchVet(VirtualNodes pNode) { // Перебераем дочерние ветки и выводим их foreach (VirtualNodes _Node in pNode.Items) { // Если есть подвкладки, то перебераем их if (_Node.Items.Count > 0) { MET_OtchVet(_Node); } // Формируем поля истории if (_Node.PROP_Data > DateTime.MinValue) { // Настраиваем поле документа UserPole_History _Pole = new UserPole_History(); _Pole.PROP_Dp = _Node.PROP_Data.ToString().Substring(0, 10); _Pole.PROP_Date = _Pole.PROP_Dp; _Pole.PROP_NumerShablon = _Node.PROP_shaNomerShablon; _Pole.PROP_DocumHistory = _Node.PROP_Docum; _Pole.PROP_Cod = (decimal?)_Node.PROP_Docum?.PROP_Protokol?.PROP_Cod ?? 0; _Pole.PROP_Vrach = _Node.PROP_Docum?.PROP_Protokol?.PROP_UserName; // Название протокола _Pole.PROP_Document = _Node.PROP_TextDefault; _Pole.Margin = new Thickness(5, 0, 0, 0); _Pole.PROP_Background = Brushes.LightYellow; _Pole.PROP_IsDelete = _Node.PROP_Docum?.PROP_Protokol?.PROP_xDelete == 1; // Находим иконку _Pole.PROP_BitmapImage = (BitmapImage)_Node.PROP_ImageSource; // Обязательно, если экспандер содержит текст, а не подвкладки _Pole.PROP_IsTexted = true; _Pole.PROP_Nodes = _Node; _Pole.MET_Inicial(); // Делегат при открытии документа _Pole.Event_OpenNewPoleHistory = MET_OpenOtch; // Добавляем поле в очередь PRO_PoleHistory.Enqueue(_Pole); // Настраиваем дополнительные параметры для подветки MET_PropertyPoleAdd(_Pole); _Node.PROP_Docum.PROP_UserPole_History = _Pole; } } }
/// <summary>МЕТОД Окрашиваем поле в зависимости от результата КДЛ</summary> /// <param name="pPole">Поле которое окрашиваем</param> private void MET_ColorKDL(UserPole_History pPole) { Color _Color; switch (pPole.PROP_Kdl) { case "без патологии": _Color = Colors.LightGreen; break; case "патология": _Color = Colors.Tomato; break; default: _Color = Colors.Yellow; break; } LinearGradientBrush _myBrush = new LinearGradientBrush(((SolidColorBrush)pPole.PROP_Background).Color, _Color, new Point(0.85, 0.4), new Point(1.0, 0.4)); pPole.PROP_Background = _myBrush; }
/// <summary>МЕТОД Настраиваем дополнительные параметры для подветки</summary> protected virtual void MET_PropertyPoleAdd(UserPole_History pPole) { }
/// <summary>МЕТОД Открываем PDF файл при открытии экспандера</summary> /// <param name="pPole">Наше поле</param> public override void MET_OpenOtch(UserPole_History pPole) { MyGlo.Event_OpenPdfNode?.Invoke(pPole.PROP_Nodes); pPole.PART_Expander.IsExpanded = false; // и тут же закрываем, что бы можно было опять открыть }
/// <summary>МЕТОД Настраиваем дополнительные параметры для подветки</summary> protected override void MET_PropertyPoleAdd(UserPole_History pPole) { pPole.PROP_Background = Brushes.Linen; }
/// <summary>МЕТОД Формируем отчет История болезни</summary> protected override void MET_Otchet() { PRO_Paragraph = new Paragraph(); MyGlo.HashOtchet.Add("eleTVItem_History", this); // Добавляем кнопки фильтра истории StackPanel _Panel = new StackPanel(); _Panel.Orientation = Orientation.Horizontal; PRO_Paragraph.Inlines.Add(_Panel); Button _ButtonSort = new Button(); Image _Image = new Image(); _Image.Height = 20; _Image.Width = 20; _Image.Source = (BitmapImage)FindResource("mnGreenUp"); _ButtonSort.Content = _Image; _ButtonSort.ToolTip = "Меняет сортировку по дате посещения на обратную"; _ButtonSort.Focusable = false; _ButtonSort.Tag = 1; _ButtonSort.Click += PART_ButtonSort_Click; _Panel.Children.Add(_ButtonSort); Label _LabelFiltr = new Label(); _LabelFiltr.Content = "Фильтр по:"; _LabelFiltr.VerticalAlignment = VerticalAlignment.Center; _Panel.Children.Add(_LabelFiltr); RadioButton _ButtonAll = new RadioButton(); _ButtonAll.Content = "Все"; _ButtonAll.ToolTip = "Отображает Все посещения"; _ButtonAll.Margin = new Thickness(5); _ButtonAll.IsChecked = true; _ButtonAll.Checked += PART_RadioButton_Checked; _Panel.Children.Add(_ButtonAll); RadioButton _ButtonIssl = new RadioButton(); _ButtonIssl.Content = "Параклиника"; _ButtonIssl.ToolTip = "Отображает только посещения в Параклинику"; _ButtonIssl.Margin = new Thickness(5); _ButtonIssl.Checked += PART_RadioButton_Checked; _Panel.Children.Add(_ButtonIssl); RadioButton _ButtonStac = new RadioButton(); _ButtonStac.Content = "Стационар"; _ButtonStac.ToolTip = "Отображает только посещения Стационара"; _ButtonStac.Margin = new Thickness(5); _ButtonStac.Checked += PART_RadioButton_Checked; _Panel.Children.Add(_ButtonStac); RadioButton _ButtonPol = new RadioButton(); _ButtonPol.Content = "Поликлиника"; _ButtonPol.ToolTip = "Отображает только посещения Поликлиники"; _ButtonPol.Margin = new Thickness(5); _ButtonPol.Checked += PART_RadioButton_Checked; _Panel.Children.Add(_ButtonPol); RadioButton _ButtonKdl = new RadioButton(); _ButtonKdl.Content = "Диагностика"; _ButtonKdl.ToolTip = " Отображает только те посещения,\n" + "в которых есть результат Диагностических исследований\n" + "(пока только Гистологии, Цитологии)"; _ButtonKdl.Margin = new Thickness(5); _ButtonKdl.Checked += PART_RadioButton_Checked; _Panel.Children.Add(_ButtonKdl); PRO_Paragraph.Inlines.Add(new LineBreak()); // разрыв строки // Заполняем список шаблонов MySql.MET_DsAdapterFill(MyQuery.MET_History_Select_1(MyGlo.KL), "History"); foreach (DataRow _Row in MyGlo.DataSet.Tables["History"].Rows) { PRO_RowShablon = _Row; UserPole_History _Pole = new UserPole_History(); string _Icon = ""; // Тип поля _Pole.PROP_Type = (eTipDocum)MET_PoleInt("Nom"); // Код документа _Pole.PROP_Cod = MET_PoleDec("Cod"); _Pole.PROP_Vrach = MET_PoleStr("Vr"); _Pole.PROP_Dp = MET_PoleDat("Dp"); _Pole.PROP_Diag = MET_PoleStr("D"); _Pole.PROP_Profil = MET_PoleStr("Profil"); _Pole.PROP_CodApstac = MET_PoleDec("CodApstac"); _Pole.PROP_Kdl = MET_PoleStr("kdl"); _Pole.PROP_IsDelete = MET_PoleInt("xDelete") == 1; _Pole.PROP_xLog = MET_PoleStr("xLog"); // В зависимости от типа: поликлинника/стационар/параклиника switch (_Pole.PROP_Type) { case eTipDocum.Pol: _Icon = "mnPosPolikl"; _Pole.PROP_Date = MET_PoleDat("Dp"); _Pole.PROP_Document = MET_PoleStr("Profil"); _Pole.PROP_Vrach = MET_PoleStr("Vr"); _Pole.PROP_Diag = MET_PoleStr("D"); // Цвет if (MET_PoleInt("pCount") > 0) { _Pole.PROP_Background = Brushes.Azure; } // Тип посещения (разовое, обращение) _Pole.PROP_Metca = MET_PoleStr("Metka"); // Если нет протоколов, то if (MET_PoleInt("pCount") == 0) { _Pole.PROP_Metca += " (без протоколов)"; _Pole.IsEnabled = false; } // Ставим значек консилиум if (MET_PoleStr("ImageInform") == "консилиум") { _Pole.MET_LoadIconInform("mnKons", "Наличие консилиума"); } _Pole.Event_OpenNewPoleHistory = MET_OpenPolicl; break; case eTipDocum.Stac: _Icon = MET_PoleStr("ImageInform"); string _Dk = MET_PoleDat("Dk"); if (_Dk == "") { _Dk = "(по сегодня)"; } _Pole.PROP_Date = MET_PoleDat("Dp") + " - " + _Dk; _Pole.PROP_Document = MET_PoleStr("Profil"); _Pole.PROP_Vrach = MET_PoleStr("Vr"); _Pole.PROP_Diag = MET_PoleStr("D"); // Цвет if (MET_PoleInt("pCount") > 0) { _Pole.PROP_Background = Brushes.AliceBlue; } // Если нет протоколов, то if (MET_PoleInt("pCount") == 0) { _Pole.PROP_Metca = "(без протоколов)"; _Pole.IsEnabled = false; } _Pole.Event_OpenNewPoleHistory = MET_OpenStac; break; case eTipDocum.Paracl: _Icon = "mnParacl"; _Pole.PROP_Date = MET_PoleDat("Dp"); _Pole.PROP_Document = MET_PoleStr("Profil"); _Pole.PROP_Vrach = MET_PoleStr("Vr"); _Pole.PROP_Background = Brushes.BlanchedAlmond; _Pole.PROP_NumerShablon = MET_PoleInt("pCount"); _Pole.PROP_IsTexted = true; _Pole.PROP_DocumHistory = new UserDocument(_Pole.PROP_Type); _Pole.PROP_DocumHistory.PROP_Protokol = UserProtokol.MET_FactoryProtokol(_Pole.PROP_Type, (int)_Pole.PROP_Cod); _Pole.MET_Inicial(); _Pole.Event_OpenNewPoleHistory = MET_Protokol; // Костыль для физиологов if (_Pole.PROP_NumerShablon > 300 & _Pole.PROP_NumerShablon < 400) { _Icon = "mnPhysiology"; _Pole.PROP_Background = Brushes.LightYellow; } break; } // Иконка _Pole.MET_LoadIcon(_Icon); // Если есть результат КДЛ, то окрашиваем это поле в зависимости от результата if (_Pole.PROP_Kdl != "" && _Pole.PROP_Type != eTipDocum.Paracl) { MET_ColorKDL(_Pole); } // Добавляем в очередь PRO_PoleHistory.Add(_Pole); // Добавляем поле в параграф PRO_Paragraph.Inlines.Add(_Pole); if (_Pole.PROP_Kdl != "" && _Pole.PROP_Type == eTipDocum.Paracl) { var _KDL = MET_GreatKDL(_Pole); // Добавляем в очередь PRO_PoleHistory.Add(_KDL); // Добавляем поле в параграф PRO_Paragraph.Inlines.Add(_KDL); } //PRO_Paragraph.Inlines.Add(new LineBreak()); // разрыв строки } }