Программное обеспечение учёта медицинских препаратов на складе - Программирование, компьютеры и кибернетика курсовая работа
Главная
Программирование, компьютеры и кибернетика
Программное обеспечение учёта медицинских препаратов на складе
Разработка распределённой системы учёта медицинских препаратов на складе. Требования к программному обеспечению, анализ концептуальной модели. Архитектурное проектирование программы в среде NetBeans 6.7.1 и СУБД JavaDB. Проверка ее работоспособности.
посмотреть текст работы
скачать работу можно здесь
полная информация о работе
весь список подобных работ
Нужна помощь с учёбой? Наши эксперты готовы помочь!
Нажимая на кнопку, вы соглашаетесь с
политикой обработки персональных данных
Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.
Размещено на http://www.allbest.ru/
Размещено на http://www.allbest.ru/
Проектирование распределённых систем ЭВМ
Программное обеспечение учёта медицинских препаратов на складе
учёт медицинский препарат программный
Склад предприятия является самой первой и самой последней точкой движения продукции по предприятию, и от ритмичности его работы во многом зависит ВЕСЬ производственный цикл. Одним из способов повышения надежности и скорости работы предприятия является формирование и управление функционированием складским хозяйством предприятия на основе последних достижений складской логистики. Особое значение имеет процесс учёта товара на складе. Применение автоматизированных систем учёта помогает обеспечить точность и своевременность ведения учёта, скорость получения необходимых данных, а также предоставляет возможность удалённого просмотра данных.
Разрабатываемая система служит для облегчения учёта товарооборота на складе, а также для ускорения этого процесса.
Основным объектом манипулирования системы служат товары и записи о поставках, которые содержат информацию о доставленном товаре, объёме партии и ответственном лице-работнике склада.
Предполагается, что программа учёта медицинских препаратов на складе должна быть легко освоена даже незнакомым с компьютерной техникой персоналом.
Требуется разработать распределённую систему для учёта медицинских препаратов на складе.
Система должна позволять просматривать состояние склада, то есть точный объём каждого вида продукции, хранящейся на складе.
Система должна позволять регистрировать новые виды продукции на складе.
Система должна позволять регистрировать операции ввоз партий продукции на склад и их вывоз. При этом должен быть указан вид продукции, объем партии, а также ответственное лицо - работник склада.
1.1 Требования к разрабатываемому ПО
Система должна обеспечивать хранение информации о товаре.
Система должна обеспечивать хранение информации о поставках.
Система должна обеспечивать хранение информации о сотрудниках.
Система должна позволять просматривать состояние склада.
Система должна позволять регистрировать новый товар на складе.
Система должна позволять просматривать список поставок.
Система должна позволять фильтровать список поставок.
Система должна позволять регистрировать новую поставку (ввоз или вывод товара)
Программа должна быть машинно-независимой.
Работа с системой должна быть реализована через десктопное приложение.
Интерфейс системы должен быть реализован на английском языке.
Система должна обеспечивать хранение следующей информации о товаре:
- Количество единиц товара на складе
Система должна обеспечивать хранение следующей информации о поставках:
Система должна обеспечивать хранение следующей информации о сотрудниках:
Система должна позволять просматривать состояние склада.
Система должна позволять регистрировать новый товар на складе.
Система должна позволять просматривать список поставок.
Система должна позволять фильтровать список поставок:
Система должна позволять регистрировать новую поставку (ввоз или вывод товара)
Время на выполнение запроса пользователя не должно превышать 1 секунду.
Для работы серверной части системы необходим сервер, обладающий следующими характеристиками:
Для работы клиентской части системы необходимы:
Работа с системой должна осуществляться c помощью десктопного приложения.
Интерфейс системы должен быть реализован на английском языке.
Рекомендуемая конфигурация сервера БД:
Резервное копирование БД выполняет заказчик.
Для работы серверной части системы необходим сервер, обладающий следующими характеристиками:
Для работы клиентской части системы необходимы:
- ПК под управлением любой ОС, поддерживающей Java.
- Подключение к сети Internet по каналу 128 Кбит/с или более широкому.
Клиентское ПО должно работать одинаково подо всеми ОС, поддерживающими Java.
Последствием аварий и других критических ситуаций, связанных с работой программы, может быть частичная или полная утеря данных, добавленных пользователями.
Склад предприятия является самой первой и самой последней точкой движения продукции по предприятию, и от ритмичности его работы во многом зависит ВЕСЬ производственный цикл. Одним из способов повышения надежности и скорости работы предприятия является формирование и управление функционированием складским хозяйством предприятия на основе последних достижений складской логистики. Особое значение имеет процесс учёта товара на складе. Применение автоматизированных систем учёта помогает обеспечить точность и своевременность ведения учёта, скорость получения необходимых данных, а также предоставляет возможность удалённого просмотра данных.
Разрабатываемая система служит для облегчения учёта товарооборота на складе, а также для ускорения этого процесса.
Основным объектом манипулирования системы служат товары и записи о поставках, которые содержат информацию о доставленном товаре, объёме партии и ответственном лице-работнике склада.
Предполагается, что программа учёта медицинских препаратов на складе должна быть легко освоена даже незнакомым с компьютерной техникой персоналом.
Журнал поставок - набор записей о ввозе-вывозе товара, с указанием товара, объёма партии и ответственного лица.
Объём партии - число единиц продукции в данной партии.
Ответственное лицо - сотрудник склада, производящий контроль и учёт поставки.
Поставка - операция ввоза партии товара на склад или его вывоза со склада.
Склад - помещение, комплекс помещений, предназначенный для хранения материальных ценностей.
Товар - любая вещь, которая может храниться на складе.
2.3 Основные прецеденты использования ПО
3. АРХИТЕКТУРНОЕ И ДЕТАЛЬНОЕ ПРОЕКТИРОВАНИЕ ПО
На сегодняшний день наибольшее распространение следующие архитектуры распределенных систем обработки данных:
- стандартная модель клиент/сервер;
- многоуровневая модель клиент/сервер.
Многопользовательские системы, основанные на технологии файл-сервера, подразумевают только совместное использование сетевых дисков, хранящих коллективные данные.
Основными недостатками данной архитектуры можно считать следующее:
- при большом количестве пользователей, данных снижается производительность, нарушается целостность данных;
- средства защиты данных, поддержки целостности данных, транзакции не предусмотрены данной архитектурой;
- реализация этих функций ложится на разработчиков, что усложняет процесс создания системы.
Многопользовательские системы, основанные на классической технологии клиент/сервер, называются двухзвенными системами или системами с «толстым клиентом».
Они состоят из двух частей - серверной и клиентской.
На серверную часть возлагаются функции управления базами данных (включая администрирование), поддержки целостности данных, обработка запросов, управление транзакциями, правами доступа к различным данным, создание объектов по реализации бизнес - правил.
На клиентскую часть возлагается обеспечение интерфейса пользователя, посылка запросов серверу БД (серверной части системы), получение результатов и сообщений от сервера, управление бизнес - правилами, проверку корректности, допустимости и обработку данных согласно содержащихся в них алгоритмах. Также нужно отметить и третий элемент такой системы - сеть и коммуникационное программное обеспечение, по которым осуществляется взаимодействие между серверной и клиентской частями системы посредством сетевых протоколов.
На рисунке 6.1 представлена схема классической архитектуры клиент/сервер.
Рисунок 4.1 - Классическая архитектура клиент-сервер
Многозвенными системами клиент/сервер называют более новые системы с так называемым ”тонким” клиентом. В этом случае функциональность, связанная с доступом к данным, возлагается на другое приложение, которое обычно называется сервером приложений и является клиентом серверной СУБД.
В свою очередь, клиентские приложения обращаются не непосредственно к серверной СУБД путем вызова соответствующих функций, а к серверу приложений, являющемуся для них источником данных.
Таким образом, информационная система становится трехзвенной, а сервер приложений является средним звеном в цепи “тонкий” клиент - сервер приложений - сервер баз данных.
На рисунке 6.2 представлена схема архитектуры клиент/сервер с “тонким” клиентом.
Для выполнения курсового проекта ввиду небольшого объёма работ и отсутствия больших нагрузок на систему выберем классическую двухслойную реализацию архитектуры «клиент-сервер».
Рисунок 4.2 - Архитектура клиент - сервер с «тонким» клиентом
3.2 Концептуальная диаграмма классов
3.3 Разработка логической модели БД ПО
3 .4.1 Проектирование клиентской части ПО
Клиентская составляющая ПО представляет собой десктопное приложение.
В архитектуре данного приложения можно выделить три составляющих:
Рисунок 4.3 - Классы-сущности предметной области
Эти классы хранят данные из таблиц БД и служат для представления объектов предметной области в проектируемом приложении.
Рисунок 4.4 - Классы слоя доступа к данным
Слой доступа к данным служит для получения данных из БД и управления ими.
Для написания слоя доступа к данным воспользуемся паттерном проектирования Row Data Gateway.
Суть его в том, что для каждой таблицы БД создаётся класс-репозиторий (repository, англ. хранилище). Данный класс содержит набор методов, обеспечивающих реализацию всех базовых методов работы с таблицей: выборка набора записей, поиск, вставка, изменение, удаление записи, а также некоторых специфических методов, если того требует предметная область.
Помимо репозиторев, создаётся класс-фасад, который централизует работу с репозиториями. Обычно он также реализует паттерн проектирования Singleton, то есть существует в программе в единственном экземпляре.
Слой доступа к данным необходим, чтобы инкапсулировать детали реализации доступа к данным от остальных логических составляющих проектируемого ПО. Теперь получение необходимой информации из БД из любой части программы будет происходить с помощью вызова одного метода Слоя доступа к данным, без необходимости задумываться о логике его работы.
Третьей частью клиентского приложения является собственно интерфейс пользователя. Он обеспечивает визуальное представление данных в удобной для пользователя форме, а также обработку его команд.
В данном случае логика работы клиентского приложения довольно проста, она заключается в получении из БД и отображении набора данных, без необходимости какой-либо её обработки. Это позволяет отказаться от создания классов бизнес-логики. Всю необходимую работу будут выполнять классы обработки пользовательского интерфейса.
3.4.2 Проектирование серверной части ПО
База данных будет содержать следующие сущности.
Таблица «Сотрудник» содержит базовую информацию о работнике склада.
Таблица «Товар» содержит основную информацию о товаре, зарегистрированного на складе.
Таблица «Поставка» содержит список поставок товаров на склад/со склада.
Количество единиц товара в поставке
Идентификатор ответственного сотрудника
Таблицы Товар и Поставка связаны отношением «один ко многим», т.к. один товар может участвовать во многих поставках, но каждая поставка содержит лишь один товар.
Таблицы Сотрудник и Поставка связаны отношением «один ко многим», т.к. один сотрудник может быть ответственным за многие поставки, но за одну поставку несет ответственность лишь один сотрудник.
На рисунке 5.1 представлен экран текущего состояния склада
Рисунок 5.1 - Текущее состояние склада
На рисунке 5.2 представлено окно регистрации нового товара
Рисунок 5.2 - Диалог добавления нового товара
На рисунке 5.3 представлен экран состояния склада после регистрации нового товара.
Рисунок 5.3 - Экран состояния склада после регистрации нового товара.
На рисунке 5.4 представлен экран журнала поставок.
Рисунок 5.4 - Экран журнала поставок.
На рисунке 5.5 представлен экран регистрации входящей поставки.
Рисунок 5.5 - Экран регистрации входящей поставки.
На рисунке 5.6 представлен экран журнала поставок после регистрации новой поставки
Рисунок 5.6 - Экран журнала поставок после регистрации новой поставки.
На рисунке 5.7 представлен экран журнала поставок, отфильтрованного по товару MultiTabs.
Рисунок 5.7 - Экран журнала поставок, отфильтрованного по товару MultiTabs.
На рисунке 5.8 представлен экран журнала поставок, отфильтрованного по сотруднику Gregory House.
Рисунок 5.8 - Экран журнала поставок, отфильтрованного по сотруднику Gregory House.
В ходе выполнения работы была разработана распределенная информационно-справочная система для учета медицинских препаратов на складе.
Для успешной работы приложения вначале была разработана логическая, физическая модель БД. Была разработана диаграмма классов, а также разработан проект архитектуры системы.
В данной работе была использована классическая двухслойная архитектура «клиент - сервер». Выбор архитектуры обоснован следующими преимуществами: простота создания, быстрота работы, отсутствие высоких нагрузок на систему.
При разработке использовалась среда NetBeans 6.7.1 и СУБД JavaDB.
Для реализации подключения к БД использовался драйвер org.apache.derby.jdbc.ClientDriver и библиотека hibernate.
В ходе проверки корректности работы системы, ошибок выявлено не было.
1 Кей С. Хорстманн, Гари Корнелл Библиотека профессионала Java 1,2 том - М:Издательский дом «Вильямс»,2010, 1120стр.
2 Swing руководство для начинающих - М:Издательский дом «Вильямс»,2009, 697стр.
3 С. Орлик Многоуровневые модели в архитектуре клиент-сервер http://ods.com.ua/win/rus/db/kbd97/22.htm
Листинг исходного кода SQL-спринтов для создания базы данных
Id int Primary Key NOT NULL GENERATED ALWAYS AS IDENTITY (START WITH 1, INCREMENT BY 1),
Name varchar(100) not null CHECK(LENGTH(Name) > 0),
CONSTRAINT UK_Employee_Name UNIQUE (Name)
Id int Primary Key NOT NULL GENERATED ALWAYS AS IDENTITY (START WITH 1, INCREMENT BY 1),
Name varchar(100) not null CHECK(LENGTH(Name) > 0),
QuantityInStock int not null default 0,
CONSTRAINT UK_Product_Name UNIQUE (Name)
Id int Primary Key NOT NULL GENERATED ALWAYS AS IDENTITY (START WITH 1, INCREMENT BY 1),
CONSTRAINT FK_Shiment_Product Foreign Key (ProductId) References Product(Id),
CONSTRAINT FK_Shiment_Employee Foreign Key (ResponsiblePersonId) References Employee(Id)
insert into ADMIN.PRODUCT (Name, Manufacturer, QuantityInStock)
values ('Strepsils', 'Ecoemical Inc.', 500);
insert into ADMIN.PRODUCT (Name, Manufacturer, QuantityInStock)
values ('Tera Flu', 'Bio Pharm', 700);
insert into ADMIN.PRODUCT (Name, Manufacturer, QuantityInStock)
values ('Vikodin', 'Biogeticals', 300);
insert into ADMIN.PRODUCT (Name, Manufacturer, QuantityInStock)
values ('Coldrex', 'Green Generation', 1000);
insert into ADMIN.PRODUCT (Name, Manufacturer, QuantityInStock)
values ('Ascorbic acid', 'Ecoemical Inc.', 2000);
insert into ADMIN.Shipment (ProductId, Quantity, DateTime, ResponsiblePersonId)
values (1, 200, TIMESTAMP('20.03.2011', '12:00:00'), 1);
insert into ADMIN.Shipment (ProductId, Quantity, DateTime, ResponsiblePersonId)
values (2, 400, TIMESTAMP('20.03.2011', '13:00:00'), 1);
insert into ADMIN.Shipment (ProductId, Quantity, DateTime, ResponsiblePersonId)
values (1, 100, TIMESTAMP('20.03.2011', '14:00:00'), 3);
insert into ADMIN.Shipment (ProductId, Quantity, DateTime, ResponsiblePersonId)
values (3, 300, TIMESTAMP('20.03.2011', '15:00:00'), 2);
insert into ADMIN.Shipment (ProductId, Quantity, DateTime, ResponsiblePersonId)
values (5, 500, TIMESTAMP('20.03.2011', '16:00:00'), 5);
Листинги исходных кодов классов клиентской части ПО
import javax.persistence.CascadeType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.OneToMany;
@NamedQueries({@NamedQuery(name = "Employee.findAll", query = "SELECT e FROM Employee e"), @NamedQuery(name = "Employee.findById", query = "SELECT e FROM Employee e WHERE e.id = :id"), @NamedQuery(name = "Employee.findByName", query = "SELECT e FROM Employee e WHERE e.name = :name")})
public class Employee implements Serializable {
private static final long serialVersionUID = 1L;
@GeneratedValue(strategy = GenerationType.IDENTITY)
@OneToMany(cascade = CascadeType.ALL, mappedBy = "responsiblepersonid")
private List shipmentList;
public Employee(Integer id, String name) {
public List getShipmentList() {
public void setShipmentList(List shipmentList) {
hash += (id != null ? id.hashCode() : 0);
public boolean equals(Object object) {
// TODO: Warning - this method won't work in the case the id fields are not set
if (!(object instanceof Employee)) {
Employee other = (Employee) object;
if ((this.id == null && other.id != null) || (this.id != null && !this.id.equals(other.id))) {
* To change this template, choose Tools | Templates
* and open the template in the editor.
import javax.persistence.CascadeType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.OneToMany;
@NamedQueries({@NamedQuery(name = "Product.findAll", query = "SELECT p FROM Product p"), @NamedQuery(name = "Product.findById", query = "SELECT p FROM Product p WHERE p.id = :id"), @NamedQuery(name = "Product.findByName", query = "SELECT p FROM Product p WHERE p.name = :name"), @NamedQuery(name = "Product.findByManufacturer", query = "SELECT p FROM Product p WHERE p.manufacturer = :manufacturer"), @NamedQuery(name = "Product.findByQuantityinstock", query = "SELECT p FROM Product p WHERE p.quantityinstock = :quantityinstock")})
public class Product implements Serializable {
private static final long serialVersionUID = 1L;
@GeneratedValue(strategy = GenerationType.IDENTITY)
@OneToMany(cascade = CascadeType.ALL, mappedBy = "productid")
private List shipmentList;
this.shipmentList = new ArrayList();
public Product(Integer id, String name, int quantityinstock) {
this.quantityinstock = quantityinstock;
this.shipmentList = new ArrayList();
public Product(Integer id, String name, String manufacturer, int quantityinstock) {
this.quantityinstock = quantityinstock;
this.shipmentList = new ArrayList();
public void setManufacturer(String manufacturer) {
public void setQuantityinstock(int quantityinstock) {
this.quantityinstock = quantityinstock;
public List getShipmentList() {
public void setShipmentList(List shipmentList) {
hash += (id != null ? id.hashCode() : 0);
public boolean equals(Object object) {
// TODO: Warning - this method won't work in the case the id fields are not set
if (!(object instanceof Product)) {
if ((this.id == null && other.id != null) || (this.id != null && !this.id.equals(other.id))) {
* To change this template, choose Tools | Templates
* and open the template in the editor.
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.TemporalType;
@NamedQueries({@NamedQuery(name = "Shipment.findAll", query = "SELECT s FROM Shipment s"), @NamedQuery(name = "Shipment.findById", query = "SELECT s FROM Shipment s WHERE s.id = :id"), @NamedQuery(name = "Shipment.findByQuantity", query = "SELECT s FROM Shipment s WHERE s.quantity = :quantity"), @NamedQuery(name = "Shipment.findByDatetime", query = "SELECT s FROM Shipment s WHERE s.datetime = :datetime")})
public class Shipment implements Serializable {
private static final long serialVersionUID = 1L;
@GeneratedValue(strategy = GenerationType.IDENTITY)
@JoinColumn(name = "RESPONSIBLEPERSONID", referencedColumnName = "ID")
private Employee responsiblepersonid;
@JoinColumn(name = "PRODUCTID", referencedColumnName = "ID")
public Shipment(Integer id, int quantity) {
public void setQuantity(int quantity) {
public void setDatetime(Date datetime) {
public Employee getResponsiblepersonid() {
public void setResponsiblepersonid(Employee responsiblepersonid) {
this.responsiblepersonid = responsiblepersonid;
public void setProductid(Product productid) {
hash += (id != null ? id.hashCode() : 0);
public boolean equals(Object object) {
// TODO: Warning - this method won't work in the case the id fields are not set
if (!(object instanceof Shipment)) {
Shipment other = (Shipment) object;
if ((this.id == null && other.id != null) || (this.id != null && !this.id.equals(other.id))) {
return "Entities.Shipment[id=" + id + "]";
* To change this template, choose Tools | Templates
* and open the template in the editor.
import javax.persistence.EntityManager;
import javax.persistence.EntityTransaction;
private EntityManager entityManager;
private String GetAllEmployeesQuery = "select e from Employee e";
public EmployeeRepository(EntityManager entityManager) {
this.entityManager = entityManager;
public List GetAllEmployees() {
Query query = entityManager.createQuery(GetAllEmployeesQuery);
public Employee GetEmployeeById(int employeeId) {
Employee employee = entityManager.find(Employee.class, employeeId);
public void InsertEmployee(Employee employee) {
EntityTransaction t = entityManager.getTransaction();
public void UpdateEmployee(Employee employee) {
EntityTransaction t = entityManager.getTransaction();
public void DeleteEmployee(int employeeId) {
EntityTransaction t = entityManager.getTransaction();
Employee Employee = GetEmployeeById(employeeId);
* To change this template, choose Tools | Templates
* and open the template in the editor.
import javax.persistence.EntityManager;
import javax.persistence.EntityTransaction;
private EntityManager entityManager;
private String GetAllProductsQuery = "select p from Product p";
public ProductRepository(EntityManager entityManager) {
this.entityManager = entityManager;
public List GetAllProducts() {
Query query = entityManager.createQuery(GetAllProductsQuery);
public Product GetProductById(int productId) {
Product product = entityManager.find(Product.class, productId);
public boolean InsertProduct(Product product) {
EntityTransaction t = entityManager.getTransaction();
public void UpdateProduct(Product product) {
EntityTransaction t = entityManager.getTransaction();
public void DeleteProduct(int productId) {
EntityTransaction t = entityManager.getTransaction();
Product Product = GetProductById(productId);
* To change this template, choose Tools | Templates
* and open the template in the editor.
import javax.persistence.EntityManager;
import javax.persistence.EntityTransaction;
private EntityManager entityManager;
private String GetAllShipmentsQuery = "select s from Shipment s";
private String GetShipmentsForProductQuery = "select s from Shipment s where s.productid.id = %1$d";
private String GetShipmentsForPersonQuery = "select s from Shipment s where s.responsiblepersonid.id = %1$d";
private String GetShipmentsForPersonAndProductQuery =
"select s from Shipment s where s.responsiblepersonid.id = %1$d and s.productid.id = %2$d";
public ShipmentRepository(EntityManager entityManager) {
this.entityManager = entityManager;
public List GetAllShipments() {
Query query = entityManager.createQuery(GetAllShipmentsQuery);
public Shipment GetShipmentById(int shipmentId) {
Shipment shipment = entityManager.find(Shipment.class, shipmentId);
public List GetShipmentForProduct(int productId) {
Query query = entityManager.createQuery(String.format(GetShipmentsForProductQuery, productId));
public List GetShipmentForPerson(int personId) {
Query query = entityManager.createQuery(String.format(GetShipmentsForPersonQuery, personId));
public List GetShipmentList(int personId, int productId) {
return GetShipmentForPerson(personId);
return GetShipmentForProduct(productId);
Query query = entityManager.createQuery(String.format(GetShipmentsForPersonAndProductQuery, personId, productId));
public boolean InsertShipment(Shipment shipment) {
Product p = StockDatabase.getInstance().getProducts().GetProductById(shipment.getProductid().getId());
p.getQuantityinstock() < Math.abs(shipment.getQuantity())) {
// trying to take TOO MUCH from stock...
int finalQuantity = p.getQuantityinstock() + shipment.getQuantity();
p.setQuantityinstock(finalQuantity);
EntityTransaction t = entityManager.getTransaction();
public void UpdateShipment(Shipment shipment) {
EntityTransaction t = entityManager.getTransaction();
public void DeleteShipment(int shipmentId) {
EntityTransaction t = entityManager.getTransaction();
Shipment Shipment = GetShipmentById(shipmentId);
* To change this template, choose Tools | Templates
* and open the template in the editor.
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
private static class SingletonHolder {
public static StockDatabase instance = new StockDatabase();
public static StockDatabase getInstance() {
private String connectionName = "StockDb";
private EntityManager entityManager;
EntityManagerFactory factory = Persistence.createEntityManagerFactory(connectionName);
entityManager = factory.createEntityManager();
employee = new EmployeeRepository(entityManager);
products = new ProductRepository(entityManager);
shipments = new ShipmentRepository(entityManager);
} catch (java.lang.ExceptionInInitializerError ex) {
public EmployeeRepository getEmployee() {
public ProductRepository getProducts() {
public ShipmentRepository getShipments() {
Классы пользовательского интерфейса
import org.jdesktop.application.Action;
import org.jdesktop.application.ResourceMap;
import org.jdesktop.application.SingleFrameApplication;
import org.jdesktop.application.FrameView;
import org.jdesktop.application.TaskMonitor;
import java.awt.event.ActionListener;
import javax.swing.DefaultComboBoxModel;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableModel;
public class StockView extends FrameView {
public StockView(SingleFrameApplication app) {
// status bar initialization - message timeout, idle icon and busy animation, etc
ResourceMap resourceMap = getResourceMap();
int messageTimeout = resourceMap.getInteger("StatusBar.messageTimeout");
messageTimer = new Timer(messageTimeout, new ActionListener() {
public void actionPerformed(ActionEvent e) {
int busyAnimationRate = resourceMap.getInteger("StatusBar.busyAnimationRate");
for (int i = 0; i < busyIcons.length; i++) {
busyIcons[i] = resourceMap.getIcon("StatusBar.busyIcons[" + i + "]");
busyIconTimer = new Timer(busyAnimationRate, new ActionListener() {
public void actionPerformed(ActionEvent e) {
busyIconIndex = (busyIconIndex + 1) % busyIcons.length;
//statusAnimationLabel.setIcon(busyIcons[busyIconIndex]);
idleIcon = resourceMap.getIcon("StatusBar.idleIcon");
//statusAnimationLabel.setIcon(idleIcon);
// connecting action tasks to status bar via TaskMonitor
TaskMonitor taskMonitor = new TaskMonitor(getApplication().getContext());
taskMonitor.addPropertyChangeListener(new java.beans.PropertyChangeListener() {
public void propertyChange(java.beans.PropertyChangeEvent evt) {
/*String propertyName = evt.getPropertyName();
if ("started".equals(propertyName)) {
statusAnimationLabel.setIcon(busyIcons[0]);
progressBar.setIndeterminate(true);
} else if ("done".equals(propertyName)) {
statusAnimationLabel.setIcon(idleIcon);
} else if ("message".equals(propertyName)) {
String text = (String)(evt.getNewValue());
statusMessageLabel.setText((text == null) ? "" : text);
} else if ("progress".equals(propertyName)) {
int value = (Integer)(evt.getNewValue());
progressBar.setIndeterminate(false);
tableProducts.getColumnModel().getColumn(0).setMinWidth(0);
tableProducts.getColumnModel().getColumn(0).setMaxWidth(0);
tableProducts.getColumnModel().getColumn(0).setWidth(0);
private void RefillProductsTable() {
List products = StockDatabase.getInstance().getProducts().GetAllProducts();
DefaultTableModel model = (DefaultTableModel) tableProducts.getModel();
model.addRow(new Object[]{product, product.getId(), product.getName(), product.getManufacturer(), product.getQuantityinstock() });
protected void RefillShipmentTable() {
RefillShipmentTable(StockDatabase.getInstance().getShipments().GetShipmentList(0, 0));
protected void RefillShipmentTable(List shipments) {
DefaultTableModel model = (DefaultTableModel) tableShipments.getModel();
for(Shipment shipment : shipments){
Utils.convertDateToDateString(shipment.getDatetime()),
shipment.getResponsiblepersonid() });
protected ComboBoxModel getEmployeeModel() {
List people = StockDatabase.getInstance().getEmployee().GetAllEmployees();
people.add(0, new Employee(0, "No filter"));
ComboBoxModel model = new DefaultComboBoxModel(people.toArray());
protected ComboBoxModel getProductsModel() {
List products = StockDatabase.getInstance().getProducts().GetAllProducts();
products.add(0, new Product(0, "No filter", 0));
ComboBoxModel model = new DefaultComboBoxModel(
JFrame mainFrame = StockApp.getApplication().getMainFrame();
aboutBox = new StockAboutBox(mainFrame);
aboutBox.setLocationRelativeTo(mainFrame);
StockApp.getApplication().show(aboutBox);
/** This method is called from within the constructor to
* WARNING: Do NOT modify this code. The content of this method is
* always regenerated by the Form Editor.
//
bindingGroup = new org.jdesktop.beansbinding.BindingGroup();
mainPanel = new javax.swing.JPanel();
jTabbedPane1 = new javax.swing.JTabbedPane();
jPanel2 = new javax.swing.JPanel();
jScrollPane1 = new javax.swing.JScrollPane();
tableProducts = new javax.swing.JTable();
btnRefresh = new javax.swing.JButton(
Программное обеспечение учёта медицинских препаратов на складе курсовая работа. Программирование, компьютеры и кибернетика.
Контрольная Работа По Теме Морфемика 5 Класс
Сочинение Письмо Подруге 7 Класс
Реферат На Тему Дипломатия И Дипломатический Этикет
Реферат по теме Нейрологические уровни и брендинг
Сочинение По Литературе По Произведению Обломов
Темы Дипломных Работ По Китайскому Языку
Курсовая Работа На Тему Планирование Персонала Как Часть Стратегического Плана Предприятия
Гете Собрание Сочинений В 10 Томах
Реферат На Тему Прошлое, Настоящее И Будущее Российской Национальной Валюты
Контрольная Работа На Тему Рынок Ценных Бумаг
Курсовая работа: Разработка структуры процессора на основе МПА с жесткой логикой
Курсовая работа по теме Управління виробничою програмою підприємства
Шпаргалка: Охорона праці на підприємстві
Контрольная Работа На Тему Причины И Условия Жестокого Поведения
Курсовая работа по теме Бухгалтерский учет материально-производственных запасов
Курсовая работа по теме Сущность и основные проблемы формирования и деятельности судебных органов
Контрольные Работы Планета
Государственная Политика В Сфере Занятости Населения Курсовая
Контрольная работа по теме Актуарні розрахунки
Дипломная работа по теме Анализ эффективности использования оборотных активов на примере предприятия ОАО УНТК
Новая идеологи уголовного судопроизводства - Государство и право доклад
Основы теории телетрафика - Программирование, компьютеры и кибернетика реферат
Профессия нефтяник - Педагогика презентация