Разработка enterprise-приложения "Больница"

Структура базы данных. Визуализация трехуровневой архитектуры, состоящей из презентационного слоя, бизнес-слоя и слоя баз данных, реализованной с помощью UML схем. Основные структурные особенности трехслойных приложений. Исходный код некоторых модулей.

Рубрика Программирование, компьютеры и кибернетика
Вид курсовая работа
Язык русский
Дата добавления 03.11.2012
Размер файла 989,9 K

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.

Размещено на http://www.allbest.ru/

Федеральное государственное бюджетное образовательное учреждение

высшего профессионального образования

«САМАРСКИЙ ГОСУДАРСТВЕННЫЙ АЭРОКОСМИЧЕСКИЙ

УНИВЕРСИТЕТ имени академика С.П. КОРОЛЕВА

(национальный исследовательский университет)»

Факультет информатики

Кафедра технической кибернетики

Пояснительная записка к курсовому проекту

по дисциплине «Технологии сетевого программирования»

Тема: «Разработка enterprise-приложения “Больница”»

Разработчики: Арискин И. А.

Ярычевская И.П.

Проверил:Белоусов А.А.

трехуровневая архитектура база данный

Задание

Разработать трехзвенную информационную систему на основе JavaEE-технологий.

Система должна предоставлять возможность просмотра и редактирования данных из базы данных, а также выполнять и показывать результаты запросов (виды запросов определяются на этапе создания системы). Всю работу пользователь системы производит через Web-интерфейс. Web-интерфейс осуществляет взаимодействие с SessionBeans, выполняющими запросы к объектам, работающим с базой данных.

Выбраны следующие аспекты выполнения проекта:

Реализация платформы JavaEE и СУБД - Glassfish_v.3.1 и Oracle 10g;

Предметная область - больница;

Java-технологии:

На Web-слое выбрана технология JSF, Servlets, PrimeFaces;

На бизнес-слое выбрана технология SessionBeans (EJB 3), Entity Persistence;

На слое данных выбрана технология JDBC.

Реферат

Курсовой проект: 52 c., 12 рисунков, 4 источник.

БАЗА ДАННЫХ, СЕССИОННЫЙ БИН, ДИАГРАММА КЛАССОВ, ENTERPRISE-ПРИЛОЖЕНИЕ, ORACLE, JSP, JDBC.

Работа посвящена разработке информационной системы на основе
JavaEE-технологий.

В результате работы реализована база данных описывающая предметную область и web-интерфейс для работы с этой базой данных.

Введение

С развитием компьютерных технологий человечество все в больших объемах использует компьютер для решения некоторых повседневных задач. Естественное удешевление компьютеров как таковых, а также компьютерных услуг, таких как интернет, повлекло за собой необходимость в разработке web приложений, удовлетворяющих нужды социума. Взрывное развитие enterprise технологий обеспечило жесткую конкуренцию на рынке программного обеспечения. Ведется множество споров по поводу пригодности некоторых языков программирования для тех или иных задач. В этом смысле хорошо показывает себя платформа Java EE, позволяя делать крупномасштабные, расширяемые enterprise приложения, соответствующие всем современным стандартам объектно-ориентированной архитектуры.

Цель данной работы продемонстрировать в работе некоторый стек технологий, который будет использоваться в создании трехслойного приложения. Трехслойное приложение будет разработано с использованием Java EE технологий. Также будут продемонстрирована одна из возможных архитектур enterprise-приложения при помощи UML-диаграмм ее частей. В качестве предметной области взята система управления больницей.

1. Структура базы данных

1.1 Описание предметной области

На данном этапе нашей работе мы моделируем БД больницы. Кратко опишем данную предметную область.

Медицинское учреждение имеет несколько отделений, которые возглавляют ведущие специалисты больницы (заведующие). Каждый сотрудник прикреплен за каким-то одним отделением. Личные дела всех сотрудников ведет отдел кадров. Заработная плата служащего зависит от занимаемой должности (врачи разных специализаций получают одинаковую зарплату). На каждого впервые обратившегося за услугами в больницу гражданина заводится амбулаторная карта, которая выдается в регистратуре вместе с талоном на прием к специалисту. Амбулаторная карта во время посещения больницы находится у пациента. Когда пациент покидает больницу, он сдает её обратно в регистратуру. Талон выдается пациенту даже в случае поступления больного на «скорой помощи». В случае необходимости стационарного лечения с пациентом заключается договор. Договор это бумажная книжка, в которой фиксируются все события связанные с лечением больного. После выздоровления пациента, договор прикрепляется к амбулаторной карте. В данной больнице также имеется пункт сдачи донорской крови, который жестко следит за базой больных СПИДом. Каждое медицинское оборудование закреплено за каким-либо кабинетом или хранится на складе.

1.2 Таблицы и атрибуты

Структура базы данных больницы представлена на рисунке 1.1.

Рисунок 1.1 - Структура базы данных

В таблице 1 представлено описание сущностей и атрибутов.

Таблица 1.1 - Описание сущностей и атрибутов

Таблица (краткое описание)

Атрибуты

Описание

Отделение (Department) - содержит в себе сведения об отделениях больницы

ID_Depart

Идентификационный номер отделения

Name

Наименование

Персонал (Workers) - содержит в себе ID каждого сотрудника больницы и ID отделения, к которому сотрудник относится

ID_worker

Идентификационный номер работника

ID_Depart

Идентификационный номер отделения

Личные данные (Pers_Data) - содержит в себе личные данные о каждом работники

FIO

ФИО работника

Bday

Дата рождения

Adress

Домашний адрес

Phone

Контактный телефон

ID_worker

Идентификационный номер работника

Служебные данные (Work_Data) - содержит в себе все необходимые служебные данные работника. Рабочая должность может быть выражена как: врач, медсестра, заведующий отделения, санитар и т.д.

ID_worker

Идентификационный номер работника

Post

Рабочая должность

Special

Специализация врача

RoomNum - номер кабинета сотрудника

Номер кабинета сотрудника

Зарплата (Money) - содержит в себе данные о зарплате. В нашей больнице зарплата сотрудника зависит от его должности, т.е., например, все врачи получают одинаковую зарплату

Post

Рабочая должность

Money

Размер зарплаты

Клиенты (Clients) - содержит в себе данные о всех клиентах, хоть раз приходивших в больницу

InsurNum

№ страхового полиса

FIO

ФИО клиента

Bday

Дата рождения

Adress

Домашний адрес

Phone

Контактный телефон

Талоны (Talons) - таблица регистратуры

ID_talon -

Идентификационный номер талона

InsurNum

№ страхового полиса

ID_worker

Идентификационный номер врача

Date _T

Дата приема

Time_ T

Время приема

Анализы (Analysis) - таблица, хранящая результаты анализов клиентов

InsurNum

№ страхового полиса

ID_An

Идентификационный номер анализа

Date_An

Дата сдачи анализа

Result

Результат анализа

Тип анализа (TypeAn) - содержит в себе описания анализов

ID_An

Идентификационный номер анализа

Name

Наименование анализа

ExpDate

Срок годности анализа

Доноры (Donors) - содержит в себе клиентов, которые хоть раз приходили сдавать донорскую кровь в нашу больницу.

InsurNum

№ страхового полиса

BloodGr

Группа крови клиента

LastDate

Дата последней сдачи крови

Count

Количество сдачь

Больные СПИДом (AIDS_patients) - содержит данные о клиентах, больных СПИДом

InsurNum

№ страхового полиса

Stage

Стадия заболевания

Стационар (Hospital) - содержит данные о стационарных больных

ContractNum

Номер договора, заключенного пациентом с больницей

InsurNum

№ страхового полиса

ID_worker

Идентификационный номер лечащего врача

Diagnosis

Диагноз клиента

DataSt

Дата поступления

DataFin

Дата выписки

HouseNum

Номер палаты, где лежит клиент

Палаты (Houses) - учет всех палат для стационарных больных

HouseNum

Номер палаты

ID_Depart

Идентификационный номер отделения, к которому относится данная палата

CountPlace

Число мест в палате

Кабинеты (Rooms) - учет всех рабочих кабинетов, находящихся в больнице

RoomNum

Номер кабинета

ID_Depart

Идентификационный номер отделения, к которому относится кабинет

Мед. Оборудования (Med_Dev) - содержит в себе сведения обо всем медицинском оборудовании, хранящемся в больнице

SerNum

Производственный серийный номер медицинского оборудования

Name

Наименование оборудования

CurRep

Текущий ремонт оборудования

RoomNum

Номер кабинета, где находится оборудование

1.3 Структура enterprise - приложения

В данном проекте будем использовать трехуровневую архитектуру, состоящую презентационного слоя, бизнес слоя и слоя баз данных. Первое запускается на клиентской машине, второе и третье на серверах различного уровня. Ниже приведена диаграмма компонентов системы (рисунок 2.1).

Рисунок 2.1 - Диаграмма компонентов

Структура слоя данных

Структура слоя данных показана на рисунке 2.2. Здесь определены сущности и показаны взаимодействия между ними. Entity-классы реализуют доменный слой приложения, т.е. представление сущностей базы данных в виде классов ООП. Они отвечают за представление таблиц в виде классов, реализуют методы доступа к полям - ячейкам таблицы. Здесь определены классы, которые отвечают представлению таблиц внутри enterprise-приложения, реализуют методы доступа к полям - элементам кортежей, т.е. в каждом классе реализованы методы get() и set() для всех полей. Так же в каждом классе переопределены методы equals(), hashCode() и toString().

Рисунок 2.2 - Структура слоя данных

Таблица 2.1 - Описание классов слоя данных

Класс

Сущность

Поле класса

Атрибут

сущности

Примечание

AidsPatients

AIDS_patients

 

 

 

 

 

Stage

Stage

 

 

 

insurnum

InsurNum

 

 

 

clients

 Ссылка на объект типа Clients, необходима для получения данных о клиенте

serialVersionUID

AnalysisPK

Analysis

 

 

 Вспомогательный класс для описания составного первичного ключа

dateAn

Date_An

idAn

ID_An

insurnum

InsurNum

Analysis

Analysis

 

 

 

 

 

analysisPK

 составной первичный ключ, объект типа AnalysisPK

 

 

result

Result

 

 

typeAn

Type_An

 

 

 

clients

InsurNum

Вместо поля InsurNum в классе используется ссылка на объект типа Clients, который соответствует данному объекту Analysis. При этом смысл поля класса и атрибута сущности совпадает.

serialVersionUID

TypeAn

Type_An

 

 

 

 

 

idAn

ID_An

 

 

 

name

Name

 

 

 

expdate

ExpDate

 

 

 

analysisCollection

 

Коллекция объектов класса Analysis, используется для реализации связи один ко многим между записями таблиц Type_An и Analysis.

serialVersionUID

Clients

Clients

 

 

 

 

 

fio

 FIO

 

 

insurnum

InsurNum

 

 

bday

BDay

 

 

 

adress

Adress

 

 

 

phone

Phone

 

 

hospitalCollection

 

 Коллекция объектов класса Hospital, используется для реализации связи один ко многим между записями таблиц Clients и Hospital.

 

 

analysisCollection

Аналогично полю hospitalCollection; в классе тип поля Collection<Analysys>.

aidsPatients

 Ссылка на объект типа AidsPatients, необходима для получения данных о клиенте

talonsCollection

Аналогично полю hospitalCollection; в классе тип поля Collection<Talons>.

donors

Ссылка на объект типа Donors, необходима для получения данных о клиенте

serialVersionUID

Department

Department

 

 

 

 

 

idDepart

ID_Depart

 

 

 

name

Name

 

 

 

roomsCollection

 Коллекция объектов класса Rooms, используется для реализации связи один ко многим между записями таблиц Department и Rooms.

 

 

housesCollection

 Аналогично полю hospitalCollection; в классе тип поля Collection<Houses>.

 

 

workersCollection

 Аналогично полю hospitalCollection; в классе тип поля Collection<Workers>.

serialVersionUID

Houses

Houses

 

 

 

 

 

housenum

HouseNum

 

 

 

countplace

 CountPlace

 

 

hospitalCollection

 Коллекция объектов класса Hospital, используется для реализации связи один ко многим между записями таблиц Houses и Hospital.

 

 

idDepart

 ID_Depart

Вместо поля ID_Depart в классе используется ссылка на объект типа Houses, который соответствует данному объекту Department. При этом смысл поля класса и атрибута сущности совпадает.

 

 

serialVersionUID

 

 

Money

Money

 

 

 

 

 

post

Post

 

 

 

money

Money

 

 

 

workDataCollection

 Коллекция объектов класса WorkData, используется для реализации связи один ко многим между записями таблиц Money и WorkData.

 

 

serialVersionUID

 

 

Donors

Donors

 

 

 

 

 

bloodgr

BloodGr

 

 

 

lastdate

LastDate

 

 

count

Count

 

 

 

insurnum

InsurNum

 

 

 

clients

 Ссылка на объект типа Clients, необходима для получения данных о клиенте

 

 

serialVersionUID

 

 

Hospital

Hospital

 

 

 

 

 

contractnum

 ContractNum

 

 

diagnosis

 Diagnosis

 

 

idWorker

ID_Worker

 

 

 

datest

DateSt

 

 

 

datefin

DateFin

 

 

housenum

HouseNum

Вместо поля HouseNum в классе используется ссылка на объект типа Houses, который соответствует данному объекту Hospital. При этом смысл поля класса и атрибута сущности совпадает.

 

 

insurnum

InsurNum

 Вместо поля InsurNum в классе используется ссылка на объект типа Clients, который соответствует данному объекту Hospital. При этом смысл поля класса и атрибута сущности совпадает.

 

 

serialVersionUID

 

 

Talons

Worker_accounting

 

 

 

 

 

idTalon

ID_Talon

 

 

 

dateT

Date_T

 

 

 

timeT

Time_T

 

 

 

idWorker

ID_Worker

 Вместо поля ID_worker в классе используется ссылка на объект типа Workers, который соответствует данному объекту Talons. При этом смысл поля класса и атрибута сущности совпадает.

 

 

insurnum

InsurNum

 Вместо поля InsurNum в классе используется ссылка на объект типа Clients, который соответствует данному объекту Talons. При этом смысл поля класса и атрибута сущности совпадает.

 

 

serialVersionUID

 

 

PersData

Pers_Data

 

 

 

 

 

fio

 FIO

 

 

idWorker

ID_Worker

 

 

bday

BDay

 

 

 

adress

Adress

 

workers

Ссылка на объект типа Workers, необходима для получения данных о клиенте

serialVersionUID

MedDev

Med_Dev

 

 

 

 

sernum

SerNum

 

 

 

name

Name

 

serialVersionUID

currep

CurRep

roomnum

RoomNum

Вместо поля RoomNum в классе используется ссылка на объект типа Rooms, который соответствует данному объекту MedDev. При этом смысл поля класса и атрибута сущности совпадает.

Workers

Workers

 

 

 

 

 

idWorker

ID_Worker

 

 

 

serialVersionUID

 

 

 

 

hospitalCollection

Worker_id_worker

 Коллекция объектов класса Hospital, используется для реализации связи один ко многим между записями таблиц Workers и Hospital.

 

 

persData

 

Ссылка на объект типа PersData, необходима для получения данных о клиенте

talonsCollection

Аналогично полю hospitalCollection; в классе тип поля Collection<Talons>.

workData

Ссылка на объект типа WorkData, необходима для получения данных о клиенте

idDepart

ID_Depart

Вместо поля ID_Depart в классе используется ссылка на объект типа Department, который соответствует данному объекту Workers. При этом смысл поля класса и атрибута сущности совпадает.

WorkData

Work_Data

 

 

 

 

special

Special

 

workers

Ссылка на объект типа Workers, необходима для получения данных о клиенте

 

 

idWorker

ID_Worker

 

roomnum

RoomNum

Вместо поля RoomNum в классе используется ссылка на объект типа Rooms, который соответствует данному объекту WorkData. При этом смысл поля класса и атрибута сущности совпадает.

post

Post

Вместо поля Post в классе используется ссылка на объект типа Money, который соответствует данному объекту WorkData. При этом смысл поля класса и атрибута сущности совпадает.

serialVersionUID

Rooms

Rooms

 

 

 

roomnum

RoomNum

medDevCollection

Коллекция объектов класса MedDev, используется для реализации связи один ко многим между записями таблиц Rooms и MedDev.

idDepart

 ID_Depart

Вместо поля ID_Depart в классе используется ссылка на объект типа Rooms, который соответствует данному объекту Department. При этом смысл поля класса и атрибута сущности совпадает.

workDataCollection

Аналогично полю medDevCollection; в классе тип поля Collection<WorkData>.

serialVersionUID

Структура бизнес - слоя

Основные бизнес-функции для сущностей предметной области инкапсулируют в себе сессионные бины, диаграммы которых представлены на рисунке 2.3.

На данном слое между классами установлено отношение агрегирования. Агрегируемый класс бин отвечает за соединение с базой данных и хранит в своем поле это соединение. В нем реализована функция доступа к данному полю.

Реализовано несколько классов бинов, реализующих Remote-интерфейсы и отвечают за работу необходимых операций с данными, а именно: добавление, удаление, редактирование записей (EditBean), проверка на наличие информации (ECheckingBean), получение данных(EGetObjectBean, ERepository), а так же обеспечивают возможность некоторых специализированных запросов (EQueryReportBean).

Remote-интерфейсы выбраны для возможности разнести отдельные элементы по разным компьютерам для распределения нагрузки. Далее будет приведено описание классов и использующихся методов.

Рисунок 2.3 - Диаграмма классов бизнес слоя

Ниже будут более подробно рассмотрены основные методы компонентов на примере класса EditBean. Этот класс предназначен для редактирования таблиц базы данных посредствам EntityManager, который используется в следующих методах:

add(Object ob) - добавление строки в таблицу базы данных;

edit(Object ob) - редактирование строки в таблице базы данных;

deleteTalon(Integer idTalon)

deleteClient(String insurnum)

deteleTypeAn(String t)

deleteAids(String insurnum)

deleteDonor(String insurnum) - удаление строки из таблиц

deleteAnalysis(AnalysisPK analysisPK)

deleteMoney(String post)

deleteHospital(Integer contractnum)

deleteMedDev(Integer sernum)

Структура web - слоя

Web-слой можно условно разделить на три основных страницы:

Стартовая страница - на ней пользователь должен авторизоваться, чтобы перейти к просмотру интересующих его данных;

Страница профиля - на ней пользователь может выбрать пункт меня основного функционала системы, доступного для данного профиля;

Страница использования функционала системы - здесь имеется ввиду не одна страница, а совокупность нескольких страниц, соединенных между собой, которые открываются посредствам непосредственно работать с системой;

Весь web-слой сделан с использованием технологии JSF. Все страницы взаимодействуют с нужными им Session Beans. На страницах ввода информации предусмотрен контроль ввода с удобными и понятными сообщениями об ошибках, а так же с выделением полей, в которых обнаружены некорректные данные.

2. Интерфейс пользователя

При входе в систему пользователь должен авторизоваться. Ему предлагается ввести логин и пароль. После успешной авторизации пользователь переходит на страницу с указанием профиля и меню основного функционала , который определяется введенными логином и паролем. Всего в программе реализовано 4 профиля: регистратура, отдел кадров, медсестра, старшая медсестра.

Нажав на ссылку, пользователь переходит на страницу выбранного пункта меню, где он также может выбрать другие действия работы. Рассмотрим для начала выбор пункта «Зарегистрировать пациента». После перехода по ссылке появляются поля для ввода данных о пациенте. После ввода всех данных, нажав на кнопку «Добавить», сведения о пациенте вносятся в базу данных. Нажав на кнопку «Обновить», вновь зарегистрированный пользователь отобразится на экране.

Далее пользователь может выбрать другие пункты меню, например, «Выдать талон». Нажав на соответствующую кнопку, появляются поля для ввода данных. Для удобства пользователя, при вводе № страхового полиса пациента, автоматически прописывается ФИО клиента, также имеются выпадающие списки, например, лечащих врачей. После заполнения всех полей можно сохранить и вывести на печать сформированный талон.

Все записи в таблицах можно редактировать, нажав на значок (рисунок 3.7 - красный круг), или удалить, нажав на соответствующую кнопку.

Также в профиле «Регистратура» реализован один из пользовательских запросов, который формирует отчет о расписании приема пациентов на сегодняшнее число.

Остальные профили программы имеют похожую структура. Там также имеется возможность создания, удаления, редактирования записей таблиц и реализация пользовательских запросов.

Заключение

В результате работы было спроектировано и реализовано трехслойное enterprise-приложение, работающее с базой данных больницы. Визуализация архитектуры была реализована с помощью UML схем, позволяющих наглядно продемонстрировать основные структурные особенности трехслойных приложений.

Можно сделать вывод о том, что J2EE упрощает разработку корпоративных приложений за счет использования стандартизованных модульных компонент и обеспечения полного набора сервисов для этих компонент. Многие аспекты работы приложения выполняются автоматически, не прибегая к сложному программированию.

Список использованных источников

Логанова Л.В. - Лекции по курсу «Базы данных и экспертные системы»

Дэвид Гери, Кей Хорстман - JavaServer Faces. Библиотека профессионала, 3-е изд.: Пер.с англ. - М.: ООО «И.Д. Вильямс», 2011. - 544 с.

Кевин Луни, Боб Брила и эксперты TUSC - Oracle Datadase 10g. Настольная книга администратора баз данных, изд. «Лори», 2008. - 377с.

Т. Коннолли, К.Бегг - Базы данных. Проектирование, реализация и сопровождение. Теория и практика, 3-е изд.: Пер.с англ. - М.: ООО «И.Д. Вильямс», 2003. - 1440с.

Приложение А . SQL - скрипты создания таблиц

CREATE TABLE AIDS_patients (Stage VARCHAR2(10) ,InsurNum VARCHAR2(12) NOT NULL)

ALTER TABLE AIDS_patients

ADD CONSTRAINT "PK_AIDS_patients" PRIMARY KEY ( InsurNum );

CREATE TABLE Analysis

(Result VARCHAR2 (15),

Date_An DATE NOT NULL ,

ID_An VARCHAR2(15) NOT NULL ,

InsurNum VARCHAR2(12) NOT NULL );

ALTER TABLE Analysis

ADD CONSTRAINT "Analysis_PK" PRIMARY KEY ( Date_An, ID_An, InsurNum ) ;

CREATE TABLE Clients

(FIO VARCHAR2 (60),

InsurNum VARCHAR2(12) NOT NULL ,

BDay DATE ,

Adress VARCHAR2 (50),

Phone VARCHAR2(14));

ALTER TABLE Clients

ADD CONSTRAINT "Clients_PK" PRIMARY KEY ( InsurNum ) ;

CREATE TABLE Department

(ID_Depart NUMBER(6) NOT NULL ,

Name VARCHAR2 (50));

ALTER TABLE Department

ADD CONSTRAINT "Department_PK" PRIMARY KEY ( ID_Depart ) ;

CREATE TABLE Donors

(BloodGr VARCHAR2(15) ,

LastDate DATE ,

Count NUMBER (3),

InsurNum VARCHAR2(12) NOT NULL);

ALTER TABLE Donors

ADD CONSTRAINT PK_Donors PRIMARY KEY ( InsurNum ) ;

CREATE TABLE Hospital

( ContractNum NUMBER (6) NOT NULL ,

Diagnosis VARCHAR2(60) ,

DateSt DATE ,

DateFin DATE ,

HouseNum NUMBER (3) NOT NULL ,

ID_worker NUMBER (6) NOT NULL ,

InsurNum VARCHAR2 (12) NOT NULL);

ALTER TABLE Hospital

ADD CONSTRAINT "Hospital_PK" PRIMARY KEY ( ContractNum ) ;

CREATE TABLE Houses

(HouseNum NUMBER (3) NOT NULL ,

CountPlace NUMBER (2),

ID_Depart NUMBER (6) NOT NULL);

ALTER TABLE Houses

ADD CONSTRAINT "Houses_PK" PRIMARY KEY ( HouseNum ) ;

CREATE TABLE Med_Dev

(SerNum NUMBER (6) NOT NULL ,

Name VARCHAR2 (30),

CurRep DATE ,

RoomNum NUMBER (3) NOT NULL);

ALTER TABLE Med_Dev

ADD CONSTRAINT "Med_Dev_PK" PRIMARY KEY ( SerNum ) ;

CREATE TABLE Money

(Post VARCHAR2(35) NOT NULL ,

Money NUMBER (5));

ALTER TABLE Money

ADD CONSTRAINT "Money_PK" PRIMARY KEY ( Post ) ;

CREATE TABLE Pers_Data

(FIO VARCHAR2 (60),

Bday DATE ,

Adress VARCHAR2 (50),

Phone VARCHAR2(14),

ID_worker NUMBER (6) NOT NULL);

ALTER TABLE Pers_Data

ADD CONSTRAINT "Pers_Data_PK" PRIMARY KEY ( ID_worker ) ;

CREATE TABLE Rooms

(RoomNum NUMBER (3) NOT NULL ,

ID_Depart NUMBER (6) NOT NULL);

ALTER TABLE Rooms

ADD CONSTRAINT "Rooms_PK" PRIMARY KEY ( RoomNum ) ;

CREATE TABLE Talons

(ID_talon NUMBER(6) NOT NULL ,

Date_T DATE ,

Time_T VARCHAR(6),

ID_worker NUMBER (6) NOT NULL ,

InsurNum VARCHAR2 (12) NULL);

ALTER TABLE Talons

ADD CONSTRAINT "Talons_PK" PRIMARY KEY ( ID_talon ) ;

CREATE TABLE Type_An

(ID_An VARCHAR2 (15) NOT NULL ,

Name VARCHAR2 (60),

ExpDate VARCHAR2 (30));

ALTER TABLE Type_An

ADD CONSTRAINT "Type_An_PK" PRIMARY KEY ( ID_An ) ;

CREATE TABLE Work_Data

(ID_Manager NUMBER (6),

Special VARCHAR2 (20),

ID_worker NUMBER (6) NOT NULL ,

Post VARCHAR2 (35) NOT NULL ,

RoomNum NUMBER (3) NOT NULL);

ALTER TABLE Work_Data

ADD CONSTRAINT "Work_Data_PK" PRIMARY KEY ( ID_worker ) ;

CREATE TABLE Workers

(ID_worker NUMBER (6) NOT NULL ,

ID_Depart NUMBER (6) NOT NULL,

status varchar2 (15) not null);

ALTER TABLE Workers

ADD CONSTRAINT "Workers_PK" PRIMARY KEY ( ID_worker ) ;

ALTER TABLE Work_Data

ADD CONSTRAINT Relation_10 FOREIGN KEY

(RoomNum ) REFERENCES Rooms ( RoomNum );

ALTER TABLE Talons

ADD CONSTRAINT Relation_13 FOREIGN KEY

( InsurNum ) REFERENCES Clients ( InsurNum ) ON DELETE set null ;

ALTER TABLE Houses

ADD CONSTRAINT Relation_15 FOREIGN KEY

( ID_Depart ) REFERENCES Department ( ID_Depart ) ON DELETE CASCADE;

ALTER TABLE Hospital

ADD CONSTRAINT Relation_16 FOREIGN KEY

( HouseNum ) REFERENCES Houses ( HouseNum) ;

ALTER TABLE Hospital

ADD CONSTRAINT Relation_17 FOREIGN KEY

( InsurNum ) REFERENCES Clients ( InsurNum ) ON DELETE CASCADE;

ALTER TABLE Med_Dev

ADD CONSTRAINT Relation_18 FOREIGN KEY

( RoomNum ) REFERENCES Rooms ( RoomNum ) ;

ALTER TABLE Talons

ADD CONSTRAINT Relation_1 FOREIGN KEY

( ID_worker ) REFERENCES Workers ( ID_worker ) ;

ALTER TABLE Hospital

ADD CONSTRAINT Relation_19 FOREIGN KEY

( ID_worker ) REFERENCES Workers ( ID_worker ) ;

ALTER TABLE Donors

ADD CONSTRAINT Relation_21 FOREIGN KEY

( InsurNum ) REFERENCES Clients ( InsurNum ) ON DELETE CASCADE ;

ALTER TABLE AIDS_patients

ADD CONSTRAINT Relation_32 FOREIGN KEY

( InsurNum ) REFERENCES Clients ( InsurNum ) ON DELETE CASCADE ;

ALTER TABLE Analysis

ADD CONSTRAINT Relation_33 FOREIGN KEY

( InsurNum ) REFERENCES Clients ( InsurNum ) ON DELETE CASCADE ;

ALTER TABLE Analysis

ADD CONSTRAINT Relation_34 FOREIGN KEY

( ID_An ) REFERENCES Type_An ( ID_An ) ON DELETE CASCADE;

ALTER TABLE Workers

ADD CONSTRAINT Relation_4 FOREIGN KEY

( ID_Depart ) REFERENCES Department ( ID_Depart ) ON DELETE CASCADE ;

ALTER TABLE Work_Data

ADD CONSTRAINT Relation_5 FOREIGN KEY

( ID_worker) REFERENCES Workers ( ID_worker ) ON DELETE CASCADE ;

ALTER TABLE Pers_Data

ADD CONSTRAINT Relation_7 FOREIGN KEY

( ID_worker ) REFERENCES Workers ( ID_worker ) ON DELETE CASCADE ;

ALTER TABLE Work_Data

ADD CONSTRAINT Relation_8 FOREIGN KEY

( Post ) REFERENCES Money ( Post ) ;

ALTER TABLE Rooms

ADD CONSTRAINT Relation_9 FOREIGN KEY

( ID_Depart ) REFERENCES Department ( ID_Depart ) ON DELETE CASCADE ;

Приложение Б. SQL - скрипты пользовательских запросов

1. Определить доноров, сдававших кровь более одного раза в текущем году.

SELECT fio

FROM clients,talons,donors

WHERE clients.insurnum=talons.insurnum

AND donors.insurnum=talons.insurnum

AND talons.date_t IN(

SELECT date_time

FROM talons

WHERE TRUNC(talons.date_t,'year')= TRUNC(sysdate,'Year'))

GROUP BY fio

HAVING COUNT(*)>1

2. Определить местонахождение больного (отделение, палата).

SELECT hospital.housenum,department.name

FROM clients,houses,department,hospital

WHERE clients.fio='Радо Анастасия Александровна'

AND hospital.insurnum =clients.insurnum

AND hospital.housenum=houses.housenum

AND houses.id_depart=department.id_depart

3. Самый результативный врач за некоторую дату

SELECT pers_data.fio

FROM pers_data,talons

WHERE talons.date_t='2.04.12'

AND pers_data.id_worker=talons.id_worker

GROUP BY fio

HAVING COUNT(*) = (

SELECT MAX(COUNT(fio))

FROM pers_data,talons

WHERE talons.date_t='2.04.12'

AND pers_data.id_worker=talons.id_worker

GROUP BY fio)

4. Определить свободные палаты в некотором отделении.

SELECT distinct houses.housenum

FROM houses, department,hospital, (

SELECT housenum,COUNT(housenum) count

FROM hospital

GROUP BY housenum) s

WHERE (houses.housenum NOT IN(

SELECT housenum

FROM hospital)

OR (houses.countplace>s.count and s.housenum=houses.housenum))

AND houses.id_depart= department.id_depart

AND department.name='Кардиологическое'

5. Определить местонахождение некоторого оборудования.

SELECT Med_dev.roomnum,department.name

FROM rooms,med_dev,department

WHERE med_dev.name='Кардиовизор'

AND med_dev.roomnum =rooms.roomnum

AND rooms.id_depart=department.id_depart

6. Определить количество мест по отделениям.

SELECT department.name, SUM(houses.countplace)

FROM department,houses

WHERE houses.id_depart=department.id_depart

GROUP BY department.name

7. Определить количество больных по отделениям за прошедший год.

SELECT department.name, COUNT(hospital.insurnum)

FROM department,hospital,clients,houses

WHERE hospital.housenum=houses.housenum

AND houses.id_depart=department.id_depart

AND TRUNC(hospital.datest,'year')= TRUNC(sysdate,'Year')

AND hospital.insurnum = clients.insurnum

GROUP BY department.name

8. Количество медоборудования по отделениям.

SELECT department.name, COUNT(med_dev.sernum)

FROM department,med_dev,rooms

WHERE med_dev.roomnum=rooms.roomnum

AND rooms.id_depart=department.id_depart

GROUP BY department.name

9. Вывести перечень сотрудников некоторого отделения.

SELECT pers_data.fio, pers_data.id_worker

FROM department,pers_data,workers

WHERE department.name = 'Донорское'

AND workers.id_depart=department.id_depart

AND pers_data.id_worker=workers.id_worker

10. Расписание лечения больных некоторого отделения.

SELECT talons.time_t,clients.fio as fio_client, pers_data.fio as fio_worker

FROM department, workers, talons, clients, pers_data

WHERE department.name='Кардиологическое'

AND department.id_depart = workers.id_depart

AND workers.id_worker=talons.id_worker

AND talons.date_t = Trunc(sysdate)

AND talons.insurnum = clients.insurnum

AND pers_data.id_worker=talons.id_worker

11. Список больных с указанием палаты, которым сегодня надо сдавать кровь.

SELECT clients.fio, hospital.housenum

FROM analysis, hospital, clients

WHERE hospital.insurnum = analysis.insurnum

AND clients.insurnum = hospital.insurnum

AND hospital.datefin >=TRUNC(sysdate)

AND analysis.date_an = TRUNC(sysdate)

AND (id_an='K1' OR id_an='K2' OR id_an='K3' OR id_an='K4')

12. Определить фонд з/п по отделениям.

SELECT department.name, SUM(money.money)

FROM department, work_data,workers, money

WHERE department.id_depart=workers.id_depart

AND workers.id_worker=work_data.id_worker

AND money.post=work_data.post

GROUP BY department.name

Приложение В. Исходный код некоторых модулей

// Класс MedDeviceBean

package managerbean.headnurse;

import entityclass.MedDev;

import interfacebean.IEditBean;

import interfacebean.IRepository;

import java.io.Serializable;

import java.util.List;

import javax.ejb.EJB;

import javax.ejb.EJBException;

import javax.faces.application.FacesMessage;

import javax.faces.bean.ManagedBean;

import javax.faces.bean.SessionScoped;

import javax.faces.context.FacesContext;

import org.primefaces.event.RowEditEvent;

@ManagedBean(name = "medDevice")

@SessionScoped

public class MedDeviceBean implements Serializable {

@EJB

private IRepository reposit;

@EJB

private IEditBean edit;

private MedDev medDev = new MedDev();

private List<MedDev> medDevs;

private MedDev selectDevice;

public void delete() {

try {

edit.deleteMedDev(selectDevice.getSernum());

update();

} catch (EJBException ex) {

FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "Действия не корректны!", "По этому не могут быть выполнены.")); } }

public void onEditRow(RowEditEvent event) {

try {

Object obj = event.getObject();

if (obj instanceof MedDev) {

MedDev w = (MedDev) obj;

edit.edit(w);

update(); }

} catch (EJBException ex) {

FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "Действия не корректны!", "По этому не могут быть выполнены.")); } }

public MedDev getSelectDevice() {

return selectDevice; }

public void setSelectDevice(MedDev selectDevice) {

this.selectDevice = selectDevice; }

public void add() {

try {

edit.add(medDev);

medDev = new MedDev();

update();

} catch (EJBException ex) {

FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "Действия не корректны!", "По этому не могут быть выполнены.")); } }

public MedDev getMedDev() {

return medDev; }

public List<MedDev> getMedDevs() {

if (medDevs == null) {

update(); }

return medDevs; }

public void setMedDevs(List<MedDev> medDevs) {

this.medDevs = medDevs; }

public void update() {

try {

medDevs = reposit.giveAllMedDevs();

} catch (EJBException ex) {

FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "Действия не корректны!", "По этому не могут быть выполнены.")); } }}

// Класс HospitalBean

package managerbean.headnurse;

import entityclass.Hospital;

import interfacebean.IEditBean;

import interfacebean.IRepository;

import java.io.Serializable;

import java.util.Calendar;

import java.util.GregorianCalendar;

import java.util.List;

import javax.ejb.EJB;

import javax.ejb.EJBException;

import javax.faces.application.FacesMessage;

import javax.faces.bean.ManagedBean;

import javax.faces.bean.SessionScoped;

import javax.faces.context.FacesContext;

import org.primefaces.event.RowEditEvent;

@ManagedBean(name = "hospitalBean")

@SessionScoped

public class HospitalBean implements Serializable {

@EJB

private IRepository reposit;

@EJB

private IEditBean edit;

private Hospital hospital = new Hospital();

private Hospital selectHos;

private List<Hospital> hospitals;

public void onEditRow(RowEditEvent event) {

try {

Object obj = event.getObject();

if (obj instanceof Hospital) {

Hospital w = (Hospital) obj;

if (w.getDatefin() != null) {

w.setHousenum(null); }

edit.edit(w);

update(); }

} catch (EJBException ex) {

FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "Действия не корректны!", "По этому не могут быть выполнены.")); } }

public void delete() {

try {

edit.deleteHospital(selectHos.getContractnum());

update();

} catch (EJBException ex) {

FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "Действия не корректны!", "По этому не могут быть выполнены.")); } }

public void add() {

try {

Calendar cal = new GregorianCalendar();

hospital.setDatest(cal.getTime());

edit.add(hospital);

hospital = new Hospital();

update();

} catch (EJBException ex) {

FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "Действия не корректны!", "По этому не могут быть выполнены.")); } }

public void update() {

try {

hospitals = reposit.giveAllHospitals();

} catch (EJBException ex) {

FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "Действия не корректны!", "По этому не могут быть выполнены.")); } }

public Hospital getHospital() {

return hospital; }

public List<Hospital> getHospitals() {

if (hospitals == null) {

update(); }

return hospitals; }

public void setHospital(Hospital hospital) {

this.hospital = hospital; }

public Hospital getSelectHos() {

return selectHos; }

public void setSelectHos(Hospital selectHos) {

this.selectHos = selectHos; }}

//Страница hospitaladd

<?xml version='1.0' encoding='UTF-8' ?>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml"

xmlns:h="http://java.sun.com/jsf/html"

xmlns:f="http://java.sun.com/jsf/core"

xmlns:p="http://primefaces.org/ui">

<f:view contentType="text/html" encoding="UTF-8">

<h:head>

<f:facet name="first">

<meta content='text/html; charset=UTF-8' http-equiv="Content-Type"/>

<title>Старшая мед. сестра</title>

</f:facet>

<style type="text/css">

body {

margin: 0px !important;

padding: 0 !important;

color: #616161 !important;

font-family: Arial,Helvetica,sans-serif !important;

font-size: 12px !important;

font-style: normal !important;

}

h1{

font-family: Arial,Helvetica,sans-serif !important;

font-size: 20px !important;

font-style: normal !important; }

</style>

</h:head>

<h:body>

<p:layout fullPage="true">

<p:layoutUnit position="north" size="160" resizable="true">

<p:graphicImage value="/image/6.jpg" width="1432" height="150"/>

</p:layoutUnit>

<p:layoutUnit id="left" position="west" size="300" resizable="true" collapsible="true" minSize="200">

<h:form id="form1">

<p:growl id="mes"/>

<p:accordionPanel activeIndex="0,1" multiple="true" >

<p:tab title="Стационар">

<h:panelGrid columns="1">

<h:commandLink value="Положить пациента в стационар"/>

<h:commandLink value="Cтационар" action="hospital"/>

<h:commandLink value="Медицинское оборудование" action="meddev"/>

</h:panelGrid>

</p:tab>

<p:tab title="Календарь">

<br />

<p:calendar mode="inline" locale="ru" navigator="none"/>

<br />

</p:tab>

<p:tab title="Запросы">

<p:commandButton value="Количество мест по отделениям" onclick="dlg2.show();" type="button"/><br/><br/>

<p:commandButton value="Свободные палаты" onclick="dlg3.show();" type="button"/><br/><br/>

<p:commandButton value="Местонахождение больного" onclick="dlg.show();" type="button"/>

</p:tab>

<p:tab title="Отчеты">

<p:commandButton value="Сдача крови на сегодня" actionListener="#{reportBean.writeGivingBloor()}" update=":form1:mes"/><br/><br/>

<p:commandButton value="Больные по отделениям за прошедший год" actionListener="#{reportBean.writeAmountPatients()}" update=":form1:mes"/>

</p:tab>

</p:accordionPanel>

</h:form>

</p:layoutUnit>

<h:form>

<p:growl id="m1"/>

<p:dialog id="Dialog" header='"Местонахождение больного"' widgetVar="dlg" resizable="auto" >

<p:growl id="mes1" showDetail="true"/>

<p:panelGrid columns="3">

<h:outputText value="Введите ФИО клиента: "/>

<p:inputText value="#{queryBean.fullName}">

<p:ajax event="blur" update="infoTable"/>

</p:inputText>

<p:commandButton value="Ok" update="infoTable"/>

</p:panelGrid>

<p:dataTable var="info" value="#{queryBean.giveLocalePatient()}" id="infoTable" emptyMessage="Записи не найдены.">

<p:column headerText="Номер палаты" style="width:125px" >

<h:outputText value="#{info.colum1}" />

</p:column>

<p:column headerText="Отделение" style="width:125px" >

<h:outputText value="#{info.colum2}" />

</p:column>

</p:dataTable>

</p:dialog>

</h:form>

<h:form>

<p:growl id="m2"/>

<p:dialog id="Dialog2" header='"Количество мест по отделениям"' widgetVar="dlg2" resizable="auto" >

<p:growl id="mes2" showDetail="true"/>

<p:dataTable var="info" value="#{queryBean.giveAmountPlace()}" id="infoTable2" emptyMessage="Записи не найдены.">

<p:column headerText="Отделение" style="width:125px" >

<h:outputText value="#{info.colum1}" />

</p:column>

<p:column headerText="Количество мест" style="width:125px" >

<h:outputText value="#{info.colum2}" />

</p:column>

</p:dataTable>

</p:dialog>

</h:form>

<h:form>

<p:growl id="m3"/>

<p:dialog id="Dialog3" header='"Свободные палаты"' widgetVar="dlg3" resizable="auto" >

<p:growl id="mes3" showDetail="true"/>

<p:panelGrid columns="2">

<h:outputLabel value="Выберите отделение: " for="depart"/>

<p:selectOneMenu id="depart" value="#{queryBean.depart}" effect="fade">

<f:selectItem itemLabel="Выберите отделение" />

<f:selectItems value="#{repository.allDepartment}" var="depart" itemLabel="#{depart.name}" itemValue="#{depart.toString()}"/>

<f:converter converterId="entityConverter"/>

<p:ajax event="valueChange" update="infoTable3"/>

</p:selectOneMenu>

</p:panelGrid>

<p:dataTable var="info" value="#{queryBean.giveFreeHouse()}" id="infoTable3" emptyMessage="Записи не найдены.">

<f:facet name="header">

Свободные палаты в отделении "#{queryBean.depart.name}"

</f:facet>

<p:column headerText="Номер палаты" style="width:125px" >

<h:outputText value="#{info}" />

</p:column>

</p:dataTable>

</p:dialog>

</h:form>

<p:layoutUnit position="center">

<h:form id="form">

<p:growl id="messages" showDetail="true"/>

<h:panelGrid columns="3">

<h:outputLabel value="№ договора:* "/>

<p:inputText id="numContract" value="#{hospitalBean.hospital.contractnum}" required="true" requiredMessage="Данное поле является обязательным для заполнения" >

<f:ajax event="keyup" render="nameError" />

</p:inputText><p:message id="nameError" for="numContract"/>

<h:outputLabel value="№ страх. полиса:* "/>

<p:selectOneMenu value="#{hospitalBean.hospital.insurnum}" effect="fade">

<f:selectItem itemLabel="Выберите пациента" />

<f:selectItems value="#{repository.allClients}" var="client" itemLabel="#{client.insurnum}" itemValue="#{client.toString()}"/>

<f:converter converterId="entityConverter"/>

</p:selectOneMenu><h:outputText/>

<h:outputLabel value="ID врача:* "/>

<p:selectOneMenu value="#{hospitalBean.hospital.idWorker}" effect="fade">

<f:selectItem itemLabel="Выберите сотрудника" />

<f:selectItems value="#{repository.allWorkers}" var="worker" itemLabel="#{worker.idWorker.toString()}" itemValue="#{worker.toString()}"/>

<f:converter converterId="entityConverter"/>

</p:selectOneMenu><h:outputText/>

<h:outputLabel value="Номер палаты:* "/>

<p:selectOneMenu value="#{hospitalBean.hospital.housenum}" effect="fade">

<f:selectItem itemLabel="Выберите кабинет" />

<f:selectItems value="#{repository.allHouses}" var="room" itemLabel="#{room.housenum.toString()}" itemValue="#{room.toString()}"/>

<f:converter converterId="entityConverter"/>

</p:selectOneMenu><h:outputText/>

<h:outputLabel value="Диагноз: "/>

<p:inputText value="#{hospitalBean.hospital.diagnosis}"/><h:outputLabel value=""/>

</h:panelGrid>

<p:commandButton id="addButton" value="Добавить" icon="ui-icon-disk" update="messages @parent"

action="#{hospitalBean.add()}"/>

</h:form>

</p:layoutUnit>

</p:layout>

</h:body>

</f:view>

</html>

// Страница hospitalall

<?xml version='1.0' encoding='UTF-8' ?>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml"

xmlns:h="http://java.sun.com/jsf/html"

xmlns:f="http://java.sun.com/jsf/core"

xmlns:p="http://primefaces.org/ui"

xmlns:c="http://java.sun.com/jsp/jstl/core"

xmlns:ui="http://java.sun.com/jsf/facelets">

<f:view contentType="text/html">

<h:head>

<f:facet name="first">

<meta content='text/html; charset=UTF-8' http-equiv="Content-Type"/>

<title>Старшая мед. сестра</title>

</f:facet>

<style type="text/css">

body {

margin: 0px !important;

padding: 0 !important;

color: #616161 !important;

font-family: Arial,Helvetica,sans-serif !important;

font-size: 12px !important;

font-style: normal !important; }

h1{

font-family: Arial,Helvetica,sans-serif !important;

font-size: 20px !important;

font-style: normal !important; }

</style>

</h:head>

<h:body>

<p:layout fullPage="true">

<p:layoutUnit position="north" size="160" resizable="true">

<p:graphicImage value="/image/6.jpg" width="1432" height="150"/>

</p:layoutUnit>

<p:layoutUnit id="left" position="west" size="300" resizable="true" collapsible="true" minSize="200">

<h:form id="form1">

<p:growl id="mes"/>

<p:accordionPanel activeIndex="0,1" multiple="true" >

<p:tab title="Стационар">

<h:panelGrid columns="1">

<h:commandLink value="Положить пациента в стационар" action="addpatient"/>

<h:commandLink value="Cтационар"/>

<h:commandLink value="Медицинское оборудование" action="meddev"/>

</h:panelGrid>

</p:tab>

<p:tab title="Календарь"> <br />

<p:calendar mode="inline" locale="ru" navigator="none"/> <br />

</p:tab>

<p:tab title="Запросы">

<p:commandButton value="Количество мест по отделениям" onclick="dlg2.show();" type="button"/><br/><br/>

<p:commandButton value="Свободные палаты" onclick="dlg3.show();" type="button"/><br/><br/>

<p:commandButton value="Местонахождение больного" onclick="dlg.show();" type="button"/>

</p:tab>

<p:tab title="Отчеты">

<p:commandButton value="Сдача крови на сегодня" actionListener="#{reportBean.writeGivingBloor()}" update=":form1:mes"/><br/><br/>

<p:commandButton value="Больные по отделениям за прошедший год" actionListener="#{reportBean.writeAmountPatients()}" update=":form1:mes"/>

</p:tab>

</p:accordionPanel>

</h:form>

</p:layoutUnit>

<h:form>

<p:growl id="m1"/>

<p:dialog id="Dialog" header='"Местонахождение больного"' widgetVar="dlg" resizable="auto" >

<p:growl id="mes1" showDetail="true"/>

<p:panelGrid columns="3">

<h:outputText value="Введите ФИО клиента: "/>

<p:inputText value="#{queryBean.fullName}">

<p:ajax event="blur" update="infoTable"/>

</p:inputText>

<p:commandButton value="Ok" update="infoTable"/>

</p:panelGrid>

<p:dataTable var="info" value="#{queryBean.giveLocalePatient()}" id="infoTable" emptyMessage="Записи не найдены.">

<p:column headerText="Номер палаты" style="width:125px" >

<h:outputText value="#{info.colum1}" />

</p:column>

<p:column headerText="Отделение" style="width:125px" >

<h:outputText value="#{info.colum2}" />

</p:column>

</p:dataTable>

</p:dialog>

</h:form>

<h:form>

<p:growl id="m2"/>

<p:dialog id="Dialog2" header='"Количество мест по отделениям"' widgetVar="dlg2" resizable="auto" >

<p:growl id="mes2" showDetail="true"/>

<p:dataTable var="info" value="#{queryBean.giveAmountPlace()}" id="infoTable2" emptyMessage="Записи не найдены.">

<p:column headerText="Отделение" style="width:125px" >

<h:outputText value="#{info.colum1}" />

</p:column>

<p:column headerText="Количество мест" style="width:125px" >

<h:outputText value="#{info.colum2}" />

</p:column>

</p:dataTable>

</p:dialog>

</h:form>

<h:form>

<p:growl id="m3"/>

<p:dialog id="Dialog3" header='"Свободные палаты"' widgetVar="dlg3" resizable="auto" >

<p:growl id="mes3" showDetail="true"/>

<p:panelGrid columns="2">

<h:outputLabel value="Выберите отделение: " for="depart"/>

<p:selectOneMenu id="depart" value="#{queryBean.depart}" effect="fade">

<f:selectItem itemLabel="Выберите отделение" />

<f:selectItems value="#{repository.allDepartment}" var="depart" itemLabel="#{depart.name}" itemValue="#{depart.toString()}"/>

<f:converter converterId="entityConverter"/>

<p:ajax event="valueChange" update="infoTable3"/>

</p:selectOneMenu>

</p:panelGrid>

<p:dataTable var="info" value="#{queryBean.giveFreeHouse()}" id="infoTable3" emptyMessage="Записи не найдены.">

<f:facet name="header">

Свободные палаты в отделении "#{queryBean.depart.name}"

</f:facet>

<p:column headerText="Номер палаты" style="width:125px" >

<h:outputText value="#{info}" />

</p:column>

</p:dataTable>

</p:dialog>

</h:form>

<p:layoutUnit position="center">

<h:form id="form3">

<p:growl id="messages" showDetail="true"/>

<p:dataTable var="hospital" value="#{hospitalBean.hospitals}" id="hospitalTable" editable="true" emptyMessage="Записи не найдены."

rowKey="#{hospital.contractnum}" selection="#{hospitalBean.selectHos}" selectionMode="single" paginator="true" rows="5"

paginatorTemplate="{CurrentPageReport} {FirstPageLink} {PreviousPageLink} {PageLinks} {NextPageLink} {LastPageLink} {RowsPerPageDropdown}"

rowsPerPageTemplate="5,10,15,20,30">

<p:ajax event="rowEdit" update="@this hospitalTable" listener="#{hospitalBean.onEditRow}" />

<f:facet name="header">

Стационар </f:facet>

<p:column headerText="Номер договора" style="width:125px" filterBy="#{hospital.contractnum}">

<h:outputText value="#{hospital.contractnum}" />

</p:column>

<p:column headerText="№ страх. полиса" style="width:125px" filterBy="#{hospital.insurnum.insurnum}">

<p:cellEditor>

<f:facet name="output">

<h:outputText value="#{hospital.insurnum.insurnum}"/> </f:facet>

<f:facet name="input">

<p:selectOneMenu value="#{hospital.insurnum}" effect="fade">

<f:selectItem itemLabel="Выберите пациента" />

<f:selectItems value="#{repository.allClients}" var="client" itemLabel="#{client.insurnum}" itemValue="#{client.toString()}"/>

<f:converter converterId="entityConverter"/>

</p:selectOneMenu>

</f:facet>

</p:cellEditor>

</p:column>

<p:column headerText="ID врача" style="width:125px" filterBy="#{hospital.idWorker.idWorker}">

<p:cellEditor>

<f:facet name="output">

<h:outputText value="#{hospital.idWorker.idWorker}"/>

</f:facet>

<f:facet name="input">

<p:selectOneMenu value="#{hospital.idWorker}" effect="fade">

<f:selectItem itemLabel="Выберите сотрудника" />

<f:selectItems value="#{repository.allWorkers}" var="worker" itemLabel="#{worker.idWorker.toString()}" itemValue="#{worker.toString()}"/>

<f:converter converterId="entityConverter"/>

</p:selectOneMenu>

</f:facet>

</p:cellEditor>

</p:column>

<p:column headerText="Номер палаты" style="width:125px" filterBy="#{hospital.housenum.housenum}">

<p:cellEditor>

<f:facet name="output">

<h:outputText value="#{hospital.housenum.housenum}"/>

</f:facet>

<f:facet name="input">

<p:selectOneMenu value="#{hospital.housenum}" effect="fade">

<f:selectItem itemLabel="Выберите кабинет" />

<f:selectItems value="#{repository.allHouses}" var="room" itemLabel="#{room.housenum.toString()}" itemValue="#{room.toString()}"/>

<f:converter converterId="entityConverter"/>

</p:selectOneMenu>

</f:facet>

</p:cellEditor>

</p:column>

<p:column headerText="Диагноз" style="width:125px" >

<p:cellEditor>

<f:facet name="output">

<h:outputText value="#{hospital.diagnosis}"/>

</f:facet>

<f:facet name="input">

<p:inputText value="#{hospital.diagnosis}" />

</f:facet>

</p:cellEditor>

</p:column>

<p:column headerText="Дaта вписки" style="width:125px" >

<p:cellEditor>


Подобные документы

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.