Разработка enterprise-приложения 'Больница'
Задание
Разработать трехзвенную информационную систему на основе Java EE-технологий.
Система должна предоставлять возможность просмотра и редактирования
данных из базы данных, а также выполнять и показывать результаты запросов (виды
запросов определяются на этапе создания системы). Всю работу пользователь
системы производит через Web-интерфейс.
Web-интерфейс осуществляет
взаимодействие с Session
Beans, выполняющими запросы к объектам,
работающим с базой данных.
Выбраны следующие аспекты выполнения проекта:
. Реализация платформы Java EE и СУБД - Glassfish_v.3.1 и Oracle
10g;
2. Предметная область - больница;
. Java-технологии:
3.1 На Web-слое выбрана технология JSF, Servlets, PrimeFaces;
3.2 На бизнес-слое выбрана технология SessionBeans (EJB
3), Entity Persistence;
3.3 На слое данных выбрана технология JDBC.
Реферат
Курсовой проект: 52 c., 12 рисунков, 4 источник.
база данных, сессионный бин, диаграмма классов, enterprise-приложение, ORACLE, JSP, JDBC.
Работа посвящена разработке информационной системы на основе JavaEE-технологий.
В результате работы реализована база данных описывающая предметную
область Футбол и web-интерфейс для
работы с этой базой данных.
Содержание
Введение
. Структура базы данных
.1 Описание предметной
области
.2 Таблицы и атрибуты
. Структура enterprise -
приложения
.1 Структура слоя данных
.2 Структура бизнес - слоя1
.3 Структура web - слоя
. Интерфейс пользователя
Заключение
Список использованных
источников
Приложение А. SQL - скрипты
создания таблиц
Приложение Б. SQL - скрипты
пользовательских запросов
Приложение В. Исходный код
некоторых модулей
Введение
С развитием компьютерных технологий человечество все в больших объемах
использует компьютер для решения некоторых повседневных задач. Естественное
удешевление компьютеров как таковых, а также компьютерных услуг, таких как
интернет, повлекло за собой необходимость в разработке web приложений, удовлетворяющих нужды социума. Взрывное
развитие enterprise технологий обеспечило жесткую
конкуренцию на рынке программного обеспечения. Ведется множество споров по
поводу пригодности некоторых языков программирования для тех или иных задач. В
этом смысле хорошо показывает себя платформа Java EE, позволяя делать крупномасштабные, расширяемые enterprise приложения, соответствующие всем современным
стандартам объектно-ориентированной архитектуры.
Цель данной работы продемонстрировать в работе некоторый стек технологий,
который будет использоваться в создании трехслойного приложения. Трехслойное
приложение будет разработано с использованием Java EE технологий. Также будут продемонстрирована одна из возможных
архитектур enterprise-приложения при помощи UML-диаграмм ее частей. В качестве
предметной области взята система управления больницей.
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
|
Номер кабинета, где находится оборудование
|
2.
Структура enterprise
- приложения
В данном проекте будем использовать трехуровневую архитектуру, состоящую
презентационного слоя, бизнес слоя и слоя баз данных. Первое запускается на
клиентской машине, второе и третье на серверах различного уровня. Ниже приведена диаграмма
компонентов системы (рисунок 2.1).
Рисунок 2.1 - Диаграмма компонентов
.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
|
|
|
|
|
|
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 Структура бизнес-слоя
Основные бизнес-функции для сущностей предметной области инкапсулируют в
себе сессионные бины, диаграммы которых представлены на рисунке 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)
.3 Структура web-слоя
Web-слой
можно условно разделить на три основных страницы:
. Стартовая страница - на ней пользователь должен авторизоваться, чтобы
перейти к просмотру интересующих его данных;
2. Страница профиля - на ней пользователь может выбрать пункт меня
основного функционала системы, доступного для данного профиля;
. Страница использования функционала системы - здесь имеется ввиду
не одна страница, а совокупность нескольких страниц, соединенных между собой,
которые открываются посредствам непосредственно работать с системой;
Весь web-слой сделан с использованием
технологии JSF. Все страницы взаимодействуют с
нужными им Session Beans. На страницах ввода информации предусмотрен контроль ввода с
удобными и понятными сообщениями об ошибках, а так же с выделением полей, в
которых обнаружены некорректные данные.
3.
Интерфейс пользователя
При входе в систему пользователь должен авторизоваться. Ему предлагается
ввести логин и пароль. На рисунке 3.1 приведен скриншот окна авторизации.
Рисунок 3.1 - Окно авторизации
После успешной авторизации пользователь переходит на страницу с указанием
профиля и меню основного функционала (рисунок 3.2), который определяется
введенными логином и паролем. Всего в программе реализовано 4 профиля:
регистратура, отдел кадров, медсестра, старшая медсестра.
Рисунок 3.2 - Окно профиля
Нажав на ссылку, пользователь переходит на страницу выбранного пункта
меню, где он также может выбрать другие действия работы. Рассмотрим для начала
выбор пункта «Зарегистрировать пациента». После перехода по ссылке появляются
поля для ввода данных о пациенте. На рисунке 3.3 показан пример регистрации
клиента.
Рисунок 3.3 - Зарегистрировать пациента
После ввода всех данных, нажав на кнопку «Добавить», сведения о пациенте
вносятся в базу данных. Нажав на кнопку «Обновить», вновь зарегистрированный
пользователь отобразится на экране (рисунок 3.4).
Рисунок 3.4 - Добавить пациента
Далее пользователь может выбрать другие пункты меню, например, «Выдать
талон». Нажав на соответствующую кнопку, появляются поля для ввода данных
(рисунок 3.5). Для удобства пользователя, при вводе № страхового полиса
пациента, автоматически прописывается ФИО клиента, также имеются выпадающие
списки, например, лечащих врачей. После заполнения всех полей можно сохранить и
вывести на печать сформированный талон (рисунок 3.6).
Рисунок 3.5 - Выдать талон
Рисунок 3.6 - Сохранение и печать талона
Все записи в таблицах можно редактировать, нажав на значок (рисунок 3.7 -
красный круг), или удалить, нажав на соответствующую кнопку.
Рисунок 3.7 - Редактирование таблиц
Также в профиле «Регистратура» реализован один из пользовательских
запросов (рисунок 3.8), который формирует отчет о расписании приема пациентов
на сегодняшнее число.
Рисунок 3.8 - Пользовательский запрос
Остальные профили программы имеют похожую структура. Там также имеется
возможность создания, удаления, редактирования записей таблиц и реализация
пользовательских запросов.
база данный enterprise больница
Заключение
В результате работы было спроектировано и реализовано трехслойное enterprise-приложение, работающее с базой
данных больницы. Визуализация архитектуры была реализована с помощью UML схем, позволяющих наглядно
продемонстрировать основные структурные особенности трехслойных приложений.
Можно сделать вывод о том, что J2EE упрощает разработку корпоративных
приложений за счет использования стандартизованных модульных компонент и
обеспечения полного набора сервисов для этих компонент. Многие аспекты работы
приложения выполняются автоматически, не прибегая к сложному программированию.
Список
использованных источников
1. Логанова
Л.В. - Лекции по курсу «Базы данных и экспертные системы»
2. Дэвид
Гери, Кей Хорстман - JavaServer Faces. Библиотека
профессионала, 3-е изд.: Пер.с англ. - М.: ООО «И.Д. Вильямс», 2011. - 544 с.
. Кевин
Луни, Боб Брила и эксперты TUSC -
Oracle Datadase 10g. Настольная книга администратора баз данных, изд. «Лори», 2008. - 377с.
4. Т.
Коннолли, К. Бегг - Базы данных. Проектирование, реализация и сопровождение.
Теория и практика, 3-е изд.: Пер.с англ. - М.: ООО «И.Д. Вильямс», 2003. -
1440с.
Приложение
А
SQL-скрипты создания таблиц
CREATE TABLE AIDS_patients (Stage VARCHAR2(10),InsurNum (12)
NOT NULL)TABLE AIDS_patientsCONSTRAINT "PK_AIDS_patients" PRIMARY KEY
(InsurNum);TABLE Analysis
(Result VARCHAR2 (15),_An DATE NOT NULL,_An VARCHAR2(15) NOT
NULL,VARCHAR2(12) NOT NULL);TABLE AnalysisCONSTRAINT "Analysis_PK"
PRIMARY KEY (Date_An, ID_An, );TABLE Clients
(FIO VARCHAR2 (60),VARCHAR2(12) NOT NULL,DATE,VARCHAR2
(50),VARCHAR2(14));TABLE ClientsCONSTRAINT "Clients_PK" PRIMARY KEY
(InsurNum);TABLE Department
(ID_Depart NUMBER(6) NOT NULL,VARCHAR2 (50));TABLE
DepartmentCONSTRAINT "Department_PK" PRIMARY KEY (ID_Depart);TABLE
Donors
(BloodGr VARCHAR2(15),DATE,NUMBER (3),VARCHAR2(12) NOT
NULL);TABLE DonorsCONSTRAINT PK_Donors PRIMARY KEY (InsurNum);TABLE Hospital
(ContractNum NUMBER (6) NOT
NULL,VARCHAR2(60),DATE,DATE,NUMBER (3) NOT NULL,_worker NUMBER (6) NOT
NULL,VARCHAR2 (12) NOT NULL);TABLE HospitalCONSTRAINT "Hospital_PK"
PRIMARY KEY (ContractNum);TABLE Houses
(HouseNum NUMBER (3) NOT NULL,NUMBER (2),_Depart NUMBER (6)
NOT NULL);TABLE HousesCONSTRAINT "Houses_PK" PRIMARY KEY
(HouseNum);TABLE Med_Dev
(SerNum NUMBER (6) NOT NULL,VARCHAR2 (30),DATE,NUMBER (3) NOT
NULL);TABLE Med_DevCONSTRAINT "Med_Dev_PK" PRIMARY KEY (SerNum);TABLE
Money
(Post VARCHAR2(35) NOT NULL,NUMBER (5));TABLE MoneyCONSTRAINT
"Money_PK" PRIMARY KEY (Post);TABLE Pers_Data
(FIO VARCHAR2 (60),DATE,VARCHAR2 (50),VARCHAR2(14),_worker
NUMBER (6) NOT NULL);TABLE Pers_DataCONSTRAINT "Pers_Data_PK" PRIMARY
KEY (ID_worker);TABLE Rooms
(RoomNum NUMBER (3) NOT NULL,_Depart NUMBER (6) NOT
NULL);TABLE RoomsCONSTRAINT "Rooms_PK" PRIMARY KEY (RoomNum);TABLE
Talons
(ID_talon NUMBER(6) NOT NULL,_T DATE,_T VARCHAR(6),_worker
NUMBER (6) NOT NULL,VARCHAR2 (12) NULL);TABLE TalonsCONSTRAINT
"Talons_PK" PRIMARY KEY (ID_talon);TABLE Type_An
(ID_An VARCHAR2 (15) NOT NULL,VARCHAR2 (60),VARCHAR2
(30));TABLE Type_AnCONSTRAINT "Type_An_PK" PRIMARY KEY (ID_An);TABLE
Work_Data
(ID_Manager NUMBER (6),VARCHAR2 (20),_worker NUMBER (6) NOT
NULL,VARCHAR2 (35) NOT NULL,NUMBER (3) NOT NULL);TABLE Work_DataCONSTRAINT
"Work_Data_PK" PRIMARY KEY (ID_worker);TABLE Workers
(ID_worker NUMBER (6) NOT NULL,_Depart NUMBER (6) NOT
NULL,varchar2 (15) not null);TABLE WorkersCONSTRAINT "Workers_PK"
PRIMARY KEY (ID_worker);TABLE Work_DataCONSTRAINT Relation_10 FOREIGN KEY
(RoomNum) REFERENCES Rooms (RoomNum);TABLE TalonsCONSTRAINT
Relation_13 FOREIGN KEY
(InsurNum) REFERENCES Clients (InsurNum) ON DELETE set
null;TABLE HousesCONSTRAINT Relation_15 FOREIGN KEY
(ID_Depart) REFERENCES Department (ID_Depart) ON DELETE
;TABLE HospitalCONSTRAINT Relation_16 FOREIGN KEY
(HouseNum) REFERENCES Houses (HouseNum);TABLE
HospitalCONSTRAINT Relation_17 FOREIGN KEY
(InsurNum) REFERENCES Clients (InsurNum) ON DELETE
CASCADE;TABLE Med_DevCONSTRAINT Relation_18 FOREIGN KEY
(RoomNum) REFERENCES Rooms (RoomNum);TABLE TalonsCONSTRAINT
Relation_1 FOREIGN KEY
(ID_worker) REFERENCES Workers (ID_worker);TABLE HospitalCONSTRAINT
Relation_19 FOREIGN KEY
(ID_worker) REFERENCES Workers (ID_worker);TABLE
DonorsCONSTRAINT Relation_21 FOREIGN KEY
(InsurNum) REFERENCES Clients (InsurNum) ON DELETE
CASCADE;TABLE AIDS_patientsCONSTRAINT Relation_32 FOREIGN KEY
(InsurNum) REFERENCES Clients (InsurNum) ON DELETE
CASCADE;TABLE AnalysisCONSTRAINT Relation_33 FOREIGN KEY
(InsurNum) REFERENCES Clients (InsurNum) ON DELETE
CASCADE;TABLE AnalysisCONSTRAINT Relation_34 FOREIGN KEY
(ID_An) REFERENCES Type_An (ID_An) ON DELETE CASCADE;TABLE
WorkersCONSTRAINT Relation_4 FOREIGN KEY
(ID_Depart) REFERENCES Department (ID_Depart) ON DELETE
;TABLE Work_DataCONSTRAINT Relation_5 FOREIGN KEY
(ID_worker) REFERENCES Workers (ID_worker) ON DELETE ;TABLE
Pers_DataCONSTRAINT Relation_7 FOREIGN KEY
(ID_worker) REFERENCES Workers (ID_worker) ON DELETE ;TABLE
Work_DataCONSTRAINT Relation_8 FOREIGN KEY
(Post) REFERENCES Money (Post);TABLE RoomsCONSTRAINT
Relation_9 FOREIGN KEY
(ID_Depart) REFERENCES Department (ID_Depart) ON DELETE ;
Приложение
Б
SQL-скрипты пользовательских запросов
. Определить доноров, сдававших кровь более одного раза в текущем году
SELECT
fioclients,talons,donorsclients.insurnum=talons.insurnumdonors.insurnum=talons.insurnumtalons.date_t
IN(date_timetalonsTRUNC(talons.date_t,'year')= TRUNC(sysdate,'Year'))BY
fioCOUNT(*)>1
2. Определить местонахождение больного (отделение, палата)
SELECT
hospital.housenum,department.nameclients,houses,department,hospital clients.fio='Радо
Анастасия Александровна'
AND hospital.insurnum
=clients.insurnumhospital.housenum=houses.housenumhouses.id_depart=department.id_depart
3. Самый результативный врач за некоторую дату
SELECT
pers_data.fiopers_data,talonstalons.date_t='2.04.12'pers_data.id_worker=talons.id_workerBY
fioCOUNT(*) =
(MAX(COUNT(fio))pers_data,talonstalons.date_t='2.04.12'pers_data.id_worker=talons.id_worker BY fio)
. Определить свободные палаты в некотором отделении
SELECT distinct houses.housenumhouses, department,hospital,
(housenum,COUNT(housenum) counthospitalBY housenum) s(houses.housenum NOT
IN(housenumhospital)(houses.countplace>s.count and
s.housenum=houses.housenum))houses.id_depart= department.id_depart department.name='Кардиологическое'
. Определить местонахождение некоторого оборудования
SELECT
Med_dev.roomnum,department.namerooms,med_dev,departmentmed_dev.name='Кардиовизор'med_dev.roomnum
=rooms.roomnumrooms.id_depart=department.id_depart
6. Определить количество мест по отделениям
SELECT department.name, SUM(houses.countplace)
FROM department,houseshouses.id_depart=department.id_depart BY department.name
. Определить количество больных по отделениям за прошедший год
SELECT department.name,
COUNT(hospital.insurnum)department,hospital,clients,houseshospital.housenum=houses.housenumhouses.id_depart=department.id_departTRUNC(hospital.datest,'year')=
TRUNC(sysdate,'Year')hospital.insurnum = clients.insurnumBY department.name
8. Количество медоборудования по отделениям
SELECT department.name, COUNT(med_dev.sernum)
FROM department,med_dev,roomsmed_dev.roomnum=rooms.roomnumrooms.id_depart=department.id_depart BY department.name
9. Вывести перечень сотрудников некоторого отделения
SELECT pers_data.fio,
pers_data.id_workerdepartment,pers_data,workersdepartment.name =
'Донорское'workers.id_depart=department.id_departpers_data.id_worker=workers.id_worker
. Расписание лечения
больных некоторого отделения
talons.time_t,clients.fio as fio_client, pers_data.fio as
fio_workerdepartment, workers, talons, clients, pers_datadepartment.name='Кардиологическое'department.id_depart
= workers.id_departworkers.id_worker=talons.id_workertalons.date_t =
Trunc(sysdate)talons.insurnum =
clients.insurnumpers_data.id_worker=talons.id_worker
11. Список больных с указанием палаты, которым сегодня надо сдавать кровь
SELECT clients.fio, hospital.housenumanalysis, hospital,
clientshospital.insurnum = analysis.insurnumclients.insurnum =
hospital.insurnumhospital.datefin >=TRUNC(sysdate)analysis.date_an =
TRUNC(sysdate)(id_an='K1' OR id_an='K2' OR id_an='K3' OR id_an='K4')
12. Определить фонд з/п по отделениям
SELECT department.name, SUM(money.money)department,
work_data,workers,
moneydepartment.id_depart=workers.id_departworkers.id_worker=work_data.id_workermoney.post=work_data.postBY
department.name
Приложение В
Исходный
код некоторых модулей
// Класс MedDeviceBean
package
managerbean.headnurse;entityclass.MedDev;interfacebean.IEditBean;interfacebean.IRepository;java.io.Serializable;java.util.List;javax.ejb.EJB;javax.ejb.EJBException;javax.faces.application.FacesMessage;javax.faces.bean.ManagedBean;javax.faces.bean.SessionScoped;javax.faces.context.FacesContext;org.primefaces.event.RowEditEvent;
@ManagedBean(name = "medDevice")
@SessionScopedclass MedDeviceBean implements Serializable {
@EJBIRepository reposit;
@EJBIEditBean edit;MedDev medDev = new
MedDev();List<MedDev> medDevs;MedDev selectDevice;void delete()
{{.deleteMedDev(selectDevice.getSernum());();
} catch (EJBException ex)
{.getCurrentInstance().addMessage(null, new (FacesMessage.SEVERITY_ERROR,
"Действия
не корректны!", "По этому не могут
быть выполнены.")); } }
public void onEditRow(RowEditEvent event) {{obj =
event.getObject();(obj instanceof MedDev) {w = (MedDev) obj;.edit(w);(); }
} catch (EJBException ex)
{.getCurrentInstance().addMessage(null, new (FacesMessage.SEVERITY_ERROR,
"Действия
не корректны!", "По этому не могут
быть выполнены.")); } }
public MedDev getSelectDevice() {selectDevice; }void
setSelectDevice(MedDev selectDevice) {.selectDevice = selectDevice; }void add()
{{.add(medDev);= new MedDev();();
} catch (EJBException ex)
{.getCurrentInstance().addMessage(null, new (FacesMessage.SEVERITY_ERROR,
"Действия
не корректны!", "По этому не могут
быть выполнены.")); } }
public MedDev getMedDev() {medDev; }List<MedDev>
getMedDevs() {(medDevs == null) {(); }medDevs; }void
setMedDevs(List<MedDev> medDevs) {.medDevs = medDevs; }void update() {{=
reposit.giveAllMedDevs();
} catch (EJBException ex)
{.getCurrentInstance().addMessage(null, new (FacesMessage.SEVERITY_ERROR,
"Действия
не корректны!", "По этому не могут
быть выполнены.")); } }}
// Класс HospitalBean
package
managerbean.headnurse;entityclass.Hospital;interfacebean.IEditBean;interfacebean.IRepository;java.io.Serializable;java.util.Calendar;java.util.GregorianCalendar;java.util.List;javax.ejb.EJB;javax.ejb.EJBException;javax.faces.application.FacesMessage;javax.faces.bean.ManagedBean;javax.faces.bean.SessionScoped;javax.faces.context.FacesContext;org.primefaces.event.RowEditEvent;
@ManagedBean(name = "hospitalBean")
@SessionScopedclass HospitalBean implements Serializable {
@EJBIRepository reposit;
@EJBIEditBean edit;Hospital hospital = new
Hospital();Hospital selectHos;List<Hospital> hospitals;void
onEditRow(RowEditEvent event) {{obj = event.getObject();(obj instanceof
Hospital) {w = (Hospital) obj;(w.getDatefin() != null) {.setHousenum(null);
}.edit(w);(); }
} catch (EJBException ex)
{.getCurrentInstance().addMessage(null, new (FacesMessage.SEVERITY_ERROR,
"Действия
не корректны!", "По этому не могут
быть выполнены.")); } }
public void delete() {
try {.deleteHospital(selectHos.getContractnum());();
} catch (EJBException ex)
{.getCurrentInstance().addMessage(null, new (FacesMessage.SEVERITY_ERROR,
"Действия
не корректны!", "По этому не могут
быть выполнены.")); } }
public void add() {{cal = new
GregorianCalendar();.setDatest(cal.getTime());.add(hospital);= new
Hospital();();
} catch (EJBException ex)
{.getCurrentInstance().addMessage(null, new (FacesMessage.SEVERITY_ERROR,
"Действия
не корректны!", "По этому не могут
быть выполнены.")); } }
public void update() {{= reposit.giveAllHospitals();
} catch (EJBException ex)
{.getCurrentInstance().addMessage(null, new (FacesMessage.SEVERITY_ERROR,
"Действия
не корректны!", "По этому не могут
быть выполнены.")); } }
public Hospital getHospital() {hospital;
}List<Hospital> getHospitals() {(hospitals == null) {(); }hospitals;
}void setHospital(Hospital hospital) {.hospital = hospital; }Hospital
getSelectHos() {selectHos; }void setSelectHos(Hospital selectHos) {.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":h="http://java.sun.com/jsf/html":f="http://java.sun.com/jsf/core":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">{: 0px !important;: 0
!important;: #616161 !important;family: Arial,Helvetica,sans-serif !important;size:
12px !important;style: normal !important;
}{family: Arial,Helvetica,sans-serif !important;size: 20px
!important;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"
="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();" ="button"/><br/><br/>
<p:commandButton value="Местонахождение
больного" ="dlg.show();" type="button"/>
</p:tab>
<p:tab title="Отчеты">
<p:commandButton value="Сдача крови на сегодня"
actionListener="#{reportBean.writeGivingBloor()}"
=":form1:mes"/><br/><br/>
<p:commandButton value="Больные по отделениям за прошедший год"
actionListener="#{reportBean.writeAmountPatients()}"
=":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()}" ="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()}" ="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" ="auto" >
<p:growl id="mes3" showDetail="true"/>
<p:panelGrid columns="2">
<h:outputLabel value="Выберите отделение: "
for="depart"/>
<p:selectOneMenu id="depart"
value="#{queryBean.depart}" ="fade">
<f:selectItem itemLabel="Выберите отделение"
/>
<f:selectItems
value="#{repository.allDepartment}" var="depart"
="#{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()}" ="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"
="#{hospitalBean.hospital.contractnum}" required="true" ="Данное поле является
обязательным для заполнения"
>
<f:ajax event="keyup"
render="nameError" />
</p:inputText><p:message id="nameError"
for="numContract"/>
<h:outputLabel value="№ страх. полиса:* "/>
<p:selectOneMenu value="#{hospitalBean.hospital.insurnum}"
="fade">
<f:selectItem itemLabel="Выберите пациента"
/>
<f:selectItems value="#{repository.allClients}"
var="client" ="#{client.insurnum}"
itemValue="#{client.toString()}"/>
<f:converter converterId="entityConverter"/>
</p:selectOneMenu><h:outputText/>
<h:outputLabel value="ID врача:* "/>
<p:selectOneMenu
value="#{hospitalBean.hospital.idWorker}" ="fade">
<f:selectItem itemLabel="Выберите сотрудника" />
<f:selectItems value="#{repository.allWorkers}"
var="worker" ="#{worker.idWorker.toString()}"
="#{worker.toString()}"/>
<f:converter converterId="entityConverter"/>
</p:selectOneMenu><h:outputText/>
<h:outputLabel value="Номер палаты:* "/>
<p:selectOneMenu
value="#{hospitalBean.hospital.housenum}" ="fade">
<f:selectItem itemLabel="Выберите кабинет" />
<f:selectItems value="#{repository.allHouses}"
var="room" ="#{room.housenum.toString()}"
="#{room.toString()}"/>
<f:converter converterId="entityConverter"/>
</p:selectOneMenu><h:outputText/>
<h:outputLabel value="Диагноз: "/>
<p:inputText value="#{hospitalBean.hospital.diagnosis}"/><h:outputLabel
=""/>
</h:panelGrid>
<p:commandButton id="addButton"
value="Добавить" icon="ui-icon-disk" ="messages
@parent"="#{hospitalBean.add()}"/>
</h:form>
</p:layoutUnit>
</p:layout>
</h:body>
</f:view>
</html>
// Страница hospitalall
<?xml version='1.0' encoding='UTF-8' ?>
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html
xmlns="http://www.w3.org/1999/xhtml":h="http://java.sun.com/jsf/html":f="http://java.sun.com/jsf/core":p="http://primefaces.org/ui":c="http://java.sun.com/jsp/jstl/core":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">{: 0px !important;: 0
!important;: #616161 !important;family: Arial,Helvetica,sans-serif
!important;size: 12px !important;style: normal !important; }{family:
Arial,Helvetica,sans-serif !important;size: 20px !important;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"
="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();" ="button"/><br/><br/>
<p:commandButton value="Местонахождение
больного" ="dlg.show();" type="button"/>
</p:tab>
<p:tab title="Отчеты">
<p:commandButton value="Сдача крови на сегодня"
actionListener="#{reportBean.writeGivingBloor()}"
=":form1:mes"/><br/><br/>
<p:commandButton value="Больные по отделениям за прошедший год"
actionListener="#{reportBean.writeAmountPatients()}"
=":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()}" ="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()}" ="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" ="auto" >
<p:growl id="mes3"
showDetail="true"/>
<p:panelGrid columns="2">
<h:outputLabel value="Выберите отделение: "
for="depart"/>
<p:selectOneMenu id="depart" value="#{queryBean.depart}"
="fade">
<f:selectItem itemLabel="Выберите отделение"
/>
<f:selectItems
value="#{repository.allDepartment}" var="depart"
="#{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()}" ="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}" ="hospitalTable"
editable="true" emptyMessage="Записи не
найдены."="#{hospital.contractnum}"
selection="#{hospitalBean.selectHos}" ="single"
paginator="true" rows="5"="{CurrentPageReport}
{FirstPageLink}
{PreviousPageLink} {PageLinks} {NextPageLink} {LastPageLink}
{RowsPerPageDropdown}"="5,10,15,20,30">
<p:ajax event="rowEdit" update="@this
hospitalTable" ="#{hospitalBean.onEditRow}" />
<f:facet name="header">
Стационар </f:facet>
<p:column headerText="Номер договора"
style="width:125px" ="#{hospital.contractnum}">
<h:outputText value="#{hospital.contractnum}"
/>
</p:column>
<p:column headerText="№ страх. полиса"
style="width:125px" ="#{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" ="#{client.insurnum}"
itemValue="#{client.toString()}"/>
<f:converter converterId="entityConverter"/>
</p:selectOneMenu>
</f:facet>
</p:cellEditor>
</p:column>
<p:column headerText="ID врача"
style="width:125px" ="#{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" ="#{worker.idWorker.toString()}"
="#{worker.toString()}"/>
<f:converter converterId="entityConverter"/>
</p:selectOneMenu>
</f:facet>
</p:cellEditor>
</p:column>
<p:column headerText="Номер палаты"
style="width:125px" ="#{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" ="#{room.housenum.toString()}"
="#{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>
<f:facet name="output">
<h:outputText value="#{hospital.datest}">
<f:convertDateTime pattern="dd-MM-yyyy"
type="date"/>
</h:outputText>
</f:facet>
<f:facet name="input">
<p:calendar value="#{hospital.datest}" locale="ru"
pattern="dd-MM-yyyy" ="true"/>
</f:facet>
</p:cellEditor>
</p:column>
<p:column headerText="Дaта выписки"
style="width:125px" >
<p:cellEditor>
<f:facet name="output">
<h:outputText value="#{hospital.datefin}">
<f:convertDateTime pattern="dd-MM-yyyy"/>
</h:outputText>
</f:facet>
<f:facet name="input">
<p:calendar value="#{hospital.datefin}"
locale="ru" pattern="dd-MM-yyyy" ="true"/>
</f:facet>
</p:cellEditor>
</p:column>
<p:column headerText="Options"
style="width:50px">
<p:rowEditor/>
</p:column>
<f:facet name="footer">
<p:commandButton id="deleteButton"
value="Удалить"
icon="ui-icon-"=":form3:hospitalTable"
action="#{hospitalBean.delete()}"/>
<p:commandButton id="update"
value="Обновить"
icon="ui-icon-refresh"=":form3:hospitalTable"
action="#{hospitalBean.update()}"/>
</f:facet>
</p:dataTable>
</h:form>
</p:layoutUnit>
</p:layout>
</h:body>
</f:view>
</html>
// Страница medicaldevice
<?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":h="http://java.sun.com/jsf/html":f="http://java.sun.com/jsf/core":p="http://primefaces.org/ui":c="http://java.sun.com/jsp/jstl/core":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">{: 0px !important;: 0
!important;: #616161 !important;family: Arial,Helvetica,sans-serif
!important;size: 12px !important;style: normal !important; }{family:
Arial,Helvetica,sans-serif !important;size: 20px !important;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"
="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тационар"
action="hospital"/>
<h:commandLink value="Медицинское оборудование"/>
</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="Поиск мед. оборудования"
="dlg.show();" type="button"/>
</p:tab>
<p:tab title="Отчеты">
<p:commandButton value="Mедоборудования
по отделениям"
actionListener="#{reportBean.writeAmountDevice()}"
=":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"/>
<h:outputText value="Введите оборудование: "/>
<p:inputText value="#{queryBean.fullName}">
<p:ajax event="blur"
update="infoTable"/>
</p:inputText>
<h:outputText value=" "/>
<p:commandButton value="Ok"
type="button"/>
<p:dataTable var="info"
value="#{queryBean.giveSearchDevice()}" ="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>
<p:layoutUnit position="center">
<p:layout
style="min-width:400px;min-height:200px;" id="layout">
<p:layoutUnit position="north"
size="200" resizable="true" header="Новая
оборудование">
<h:form id="form">
<p:growl id="messages"
showDetail="true"/>
<h:panelGrid columns="3">
<h:outputLabel value="Серийный номер:* "/>
<p:inputText id="serNum"
value="#{medDevice.medDev.sernum}" ="true"
requiredMessage="Данное поле является
обязательным
для заполнения" >
<f:ajax event="keyup"
render="nameError" />
</p:inputText><p:message id="nameError"
for="serNum"/>
<h:outputLabel value="Наименование: "/>
<p:inputText
value="#{medDevice.medDev.name}"/>
<h:outputLabel value=""/>
<h:outputLabel value="Номер кабинета: "/>
<p:selectOneMenu value="#{medDevice.medDev.roomnum}"
="fade">
<f:selectItem itemLabel="Выберите кабинет" />
<f:selectItems value="#{repository.allRooms}"
var="room" ="#{room.roomnum.toString()}"
="#{room.toString()}"/>
<f:converter converterId="entityConverter"/>
</p:selectOneMenu><h:outputLabel value=""/>
</h:panelGrid>
<p:commandButton id="addButton"
value="Добавить" icon="ui-icon-disk" ="messages
@parent"="#{medDevice.add()}"/>
</h:form>
</p:layoutUnit>
<p:layoutUnit id="layout2"
position="center" size="300" resizable="true"
="300" maxSize="300">
<h:form id="form3">
<p:dataTable var="device"
value="#{medDevice.medDevs}" ="deviceTable"
editable="true" emptyMessage="Записи не
найдены."="#{device.sernum}"
selection="#{medDevice.selectDevice}" ="single"
paginator="true" rows="5"="{CurrentPageReport}
{FirstPageLink}
{PreviousPageLink} {PageLinks} {NextPageLink} {LastPageLink}
{RowsPerPageDropdown}"="5,10,15,20,30">
<p:ajax event="rowEdit" update="@this
deviceTable" ="#{medDevice.onEditRow}" />
<f:facet name="header">
Медицинское оборудование
</f:facet>
<p:column headerText="Серийный номер"
style="width:125px" >
<h:outputText value="#{device.sernum}" />
</p:column>
<p:column headerText="Наименование"
style="width:125px" >
<p:cellEditor>
<f:facet name="output">
<h:outputText value="#{device.name}"/>
</f:facet>
<f:facet name="input">
<p:inputText value="#{device.name}" />
</f:facet>
</p:cellEditor>
</p:column>
<p:column headerText="Последний ремонт"
style="width:125px" >
<p:cellEditor>
<f:facet name="output">
<h:outputText value="#{device.currep}">
<f:convertDateTime pattern="dd-MM-yyyy"
locale="ru" ="Europe/Moscow" />
</h:outputText>
</f:facet>
<f:facet name="input">
<p:calendar value="#{device.currep}"
id="cal" locale="ru" pattern="dd-yyyy"
showButtonPanel="true"/>
</f:facet>
</p:cellEditor>
</p:column>
<p:column headerText="Номер кабинета"
style="width:125px" >
<p:cellEditor>
<f:facet name="output">
<h:outputText
value="#{device.roomnum.roomnum}"/>
</f:facet>
<f:facet name="input">
<p:selectOneMenu value="#{device.roomnum}"
effect="fade">
<f:selectItem itemLabel="Выберите кабинет" />
<f:selectItems value="#{repository.allRooms}"
var="room" ="#{room.roomnum.toString()}"
="#{room.toString()}"/>
<f:converter converterId="entityConverter"/>
</p:selectOneMenu>
</f:facet>
</p:cellEditor>
</p:column>
<p:column headerText="Options"
style="width:50px">
<p:rowEditor/>
<f:facet name="footer">
<p:commandButton id="deleteButton"
value="Удалить"
icon="ui-icon-"=":form3:deviceTable"
action="#{medDevice.delete()}"/>
<p:commandButton id="update"
value="Обновить"
icon="ui-icon-refresh"=":form3:deviceTable"
action="#{medDevice.update()}"/>
</f:facet>
</p:dataTable>
</h:form>
</p:layoutUnit>
</p:layout>
</p:layoutUnit>
</p:layout>
</h:body>
</f:view>
</html>