Программное обеспечение учёта медицинских препаратов на складе

Разработка распределённой системы учёта медицинских препаратов на складе. Требования к программному обеспечению, анализ концептуальной модели. Архитектурное проектирование программы в среде NetBeans 6.7.1 и СУБД JavaDB. Проверка ее работоспособности.

Рубрика Программирование, компьютеры и кибернетика
Вид курсовая работа
Язык русский
Дата добавления 23.08.2014
Размер файла 1,5 M

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

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

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

77

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

Курсовой проект

Проектирование распределённых систем ЭВМ

Программное обеспечение учёта медицинских препаратов на складе

ВВЕДЕНИЕ

учёт медицинский препарат программный

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

Разрабатываемая система служит для облегчения учёта товарооборота на складе, а также для ускорения этого процесса.

Основным объектом манипулирования системы служат товары и записи о поставках, которые содержат информацию о доставленном товаре, объёме партии и ответственном лице-работнике склада.

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

1. Постановка задачи

Требуется разработать распределённую систему для учёта медицинских препаратов на складе.

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

Система должна позволять регистрировать новые виды продукции на складе.

Система должна позволять регистрировать операции ввоз партий продукции на склад и их вывоз. При этом должен быть указан вид продукции, объем партии, а также ответственное лицо - работник склада.

1.1 Требования к разрабатываемому ПО

1.1.1 Требования пользователя

Система должна обеспечивать хранение информации о товаре.

Система должна обеспечивать хранение информации о поставках.

Система должна обеспечивать хранение информации о сотрудниках.

Система должна позволять просматривать состояние склада.

Система должна позволять регистрировать новый товар на складе.

Система должна позволять просматривать список поставок.

Система должна позволять фильтровать список поставок.

Система должна позволять регистрировать новую поставку (ввоз или вывод товара)

Программа должна быть машинно-независимой.

Работа с системой должна быть реализована через десктопное приложение.

Интерфейс системы должен быть реализован на английском языке.

1.1.2 Требования к ПО

Требования к функциональности

Система должна обеспечивать хранение следующей информации о товаре:

- Название

- Производитель

- Количество единиц товара на складе

Система должна обеспечивать хранение следующей информации о поставках:

- Дата поставки

- Товар

- Объём партии

- Ответственное лицо

Система должна обеспечивать хранение следующей информации о сотрудниках:

- Полное имя сотрудника

Система должна позволять просматривать состояние склада.

Система должна позволять регистрировать новый товар на складе.

Система должна позволять просматривать список поставок.

Система должна позволять фильтровать список поставок:

- По товару

- По ответственному лицу

Система должна позволять регистрировать новую поставку (ввоз или вывод товара)

Требования к производительности

Время на выполнение запроса пользователя не должно превышать 1 секунду.

Требования к интерфейсу

Для работы серверной части системы необходим сервер, обладающий следующими характеристиками:

- JavaDB Server

- Подключение к сети Internet

Для работы клиентской части системы необходимы:

- ПК, подключённый к сети Internet

- JRE 6

Требования операционные

Работа с системой должна осуществляться c помощью десктопного приложения.

Интерфейс системы должен быть реализован на английском языке.

Требования к ресурсам

Рекомендуемая конфигурация сервера БД:

- ЦПУ Intel Core 2 Duo 2.2 ГГц

- Оперативная память 2 Гб

- ОС Microsoft Windows Server 2008

- СУБД JavaDB

- Интернет-канал 100 Мбит/с

Требования к защите

Резервное копирование БД выполняет заказчик.

Требования по мобильности

Для работы серверной части системы необходим сервер, обладающий следующими характеристиками:

- ЦПУ Intel Core 2 Duo 2.2 ГГц

- Оперативная память 2 Гб

- Любая ОС, поддерживающая JRE

- СУБД JavaDB

- Интернет-канал 100 Мбит/с

Для работы клиентской части системы необходимы:

- ПК под управлением любой ОС, поддерживающей Java.

- Java Runtime Environment 6

- Подключение к сети Internet по каналу 128 Кбит/с или более широкому.

Требования по качеству ПО

Клиентское ПО должно работать одинаково подо всеми ОС, поддерживающими Java.

Требования по надёжности

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

2. Анализ требований

2.1 Описание концептуальной модели

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

Разрабатываемая система служит для облегчения учёта товарооборота на складе, а также для ускорения этого процесса.

Основным объектом манипулирования системы служат товары и записи о поставках, которые содержат информацию о доставленном товаре, объёме партии и ответственном лице-работнике склада.

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

2.2 Словарь предметной области

Журнал поставок - набор записей о ввозе-вывозе товара, с указанием товара, объёма партии и ответственного лица.

Объём партии - число единиц продукции в данной партии.

Ответственное лицо - сотрудник склада, производящий контроль и учёт поставки.

Поставка - операция ввоза партии товара на склад или его вывоза со склада.

Склад - помещение, комплекс помещений, предназначенный для хранения материальных ценностей.

Товар - любая вещь, которая может храниться на складе.

2.3 Основные прецеденты использования ПО

3. АРХИТЕКТУРНОЕ И ДЕТАЛЬНОЕ ПРОЕКТИРОВАНИЕ ПО

3.1 Архитектурное проектирование

На сегодняшний день наибольшее распространение следующие архитектуры распределенных систем обработки данных:

- файл-сервер;

- стандартная модель клиент/сервер;

- многоуровневая модель клиент/сервер.

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

Основными недостатками данной архитектуры можно считать следующее:

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

- средства защиты данных, поддержки целостности данных, транзакции не предусмотрены данной архитектурой;

- реализация этих функций ложится на разработчиков, что усложняет процесс создания системы.

Многопользовательские системы, основанные на классической технологии клиент/сервер, называются двухзвенными системами или системами с «толстым клиентом».

Они состоят из двух частей - серверной и клиентской.

На серверную часть возлагаются функции управления базами данных (включая администрирование), поддержки целостности данных, обработка запросов, управление транзакциями, правами доступа к различным данным, создание объектов по реализации бизнес - правил.

На клиентскую часть возлагается обеспечение интерфейса пользователя, посылка запросов серверу БД (серверной части системы), получение результатов и сообщений от сервера, управление бизнес - правилами, проверку корректности, допустимости и обработку данных согласно содержащихся в них алгоритмах. Также нужно отметить и третий элемент такой системы - сеть и коммуникационное программное обеспечение, по которым осуществляется взаимодействие между серверной и клиентской частями системы посредством сетевых протоколов.

На рисунке 6.1 представлена схема классической архитектуры клиент/сервер.

Рисунок 4.1 - Классическая архитектура клиент-сервер

Многозвенными системами клиент/сервер называют более новые системы с так называемым ”тонким” клиентом. В этом случае функциональность, связанная с доступом к данным, возлагается на другое приложение, которое обычно называется сервером приложений и является клиентом серверной СУБД.

В свою очередь, клиентские приложения обращаются не непосредственно к серверной СУБД путем вызова соответствующих функций, а к серверу приложений, являющемуся для них источником данных.

Таким образом, информационная система становится трехзвенной, а сервер приложений является средним звеном в цепи “тонкий” клиент - сервер приложений - сервер баз данных.

На рисунке 6.2 представлена схема архитектуры клиент/сервер с “тонким” клиентом.

Для выполнения курсового проекта ввиду небольшого объёма работ и отсутствия больших нагрузок на систему выберем классическую двухслойную реализацию архитектуры «клиент-сервер».

Рисунок 4.2 - Архитектура клиент - сервер с «тонким» клиентом

3.2 Концептуальная диаграмма классов

3.3 Разработка логической модели БД ПО

3.4 Детальное проектирование

3.4.1 Проектирование клиентской части ПО

Клиентская составляющая ПО представляет собой десктопное приложение.

В архитектуре данного приложения можно выделить три составляющих:

Классы-сущности предметной области

Рисунок 4.3 - Классы-сущности предметной области

Эти классы хранят данные из таблиц БД и служат для представления объектов предметной области в проектируемом приложении.

Слой доступа к данным

Рисунок 4.4 - Классы слоя доступа к данным

Слой доступа к данным служит для получения данных из БД и управления ими.

Для написания слоя доступа к данным воспользуемся паттерном проектирования Row Data Gateway.

Суть его в том, что для каждой таблицы БД создаётся класс-репозиторий (repository, англ. хранилище). Данный класс содержит набор методов, обеспечивающих реализацию всех базовых методов работы с таблицей: выборка набора записей, поиск, вставка, изменение, удаление записи, а также некоторых специфических методов, если того требует предметная область.

Помимо репозиторев, создаётся класс-фасад, который централизует работу с репозиториями. Обычно он также реализует паттерн проектирования Singleton, то есть существует в программе в единственном экземпляре.

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

Пользовательский интерфейс

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

В данном случае логика работы клиентского приложения довольно проста, она заключается в получении из БД и отображении набора данных, без необходимости какой-либо её обработки. Это позволяет отказаться от создания классов бизнес-логики. Всю необходимую работу будут выполнять классы обработки пользовательского интерфейса.

3.4.2 Проектирование серверной части ПО

Рисунок 4.5 - Логическая модель БД

База данных будет содержать следующие сущности.

Таблица «Сотрудник»

Таблица «Сотрудник» содержит базовую информацию о работнике склада.

Таблица 4.1 - Сотрудник

Id

Integer

Идентификатор пользователя

Name

Varchar

Имя пользователя

Таблица «Товар»

Таблица «Товар» содержит основную информацию о товаре, зарегистрированного на складе.

Таблица 4.1 - Товар

Id

Integer

Идентификатор товара

Name

Varchar

Название товара

Manufacturer

Varchar

Название производителя товара

QuantityInStock

Integer

Количество единиц товара на складе

Таблица «Поставка»

Таблица «Поставка» содержит список поставок товаров на склад/со склада.

Таблица 4.3 - Поставка

Id

Integer

Идентификатор поставки

ProductId

Integer

Идентификатор товара

Quantity

Integer

Количество единиц товара в поставке

ResponsiblePersonId

Integer

Идентификатор ответственного сотрудника

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

Таблицы Сотрудник и Поставка связаны отношением «один ко многим», т.к. один сотрудник может быть ответственным за многие поставки, но за одну поставку несет ответственность лишь один сотрудник.

4. ПРОВЕРКА РАБОТОСПОСОБНОСТИ ПО

На рисунке 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-спринтов для создания базы данных

create table ADMIN.Employee

(

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)

);

create table ADMIN.Product

(

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),

Manufacturer varchar(100),

QuantityInStock int not null default 0,

CONSTRAINT UK_Product_Name UNIQUE (Name)

);

create table ADMIN.Shipment

(

Id int Primary Key NOT NULL GENERATED ALWAYS AS IDENTITY (START WITH 1, INCREMENT BY 1),

ProductId int not null,

Quantity int not null,

DateTime Timestamp,

ResponsiblePersonId int not null,

CONSTRAINT FK_Shiment_Product Foreign Key (ProductId) References Product(Id),

CONSTRAINT FK_Shiment_Employee Foreign Key (ResponsiblePersonId) References Employee(Id)

);

insert into ADMIN.EMPLOYEE (Name)

values ('James Winkles');

insert into ADMIN.EMPLOYEE (Name)

values ('John Snipes');

insert into ADMIN.EMPLOYEE (Name)

values ('Gregory House');

insert into ADMIN.EMPLOYEE (Name)

values ('Jessica Gamilton');

insert into ADMIN.EMPLOYEE (Name)

values ('Sarah Daniels');

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);

Приложение Б

Листинги исходных кодов классов клиентской части ПО

Классы-сущности

package Entities;

import java.io.Serializable;

import java.util.List;

import javax.persistence.Basic;

import javax.persistence.CascadeType;

import javax.persistence.Column;

import javax.persistence.Entity;

import javax.persistence.GeneratedValue;

import javax.persistence.GenerationType;

import javax.persistence.Id;

import javax.persistence.NamedQueries;

import javax.persistence.NamedQuery;

import javax.persistence.OneToMany;

import javax.persistence.Table;

/**

*

* @author Humanity

*/

@Entity

@Table(name = "EMPLOYEE")

@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;

@Id

@GeneratedValue(strategy = GenerationType.IDENTITY)

@Basic(optional = false)

@Column(name = "ID")

private Integer id;

@Basic(optional = false)

@Column(name = "NAME")

private String name;

@OneToMany(cascade = CascadeType.ALL, mappedBy = "responsiblepersonid")

private List<Shipment> shipmentList;

public Employee() {

}

public Employee(Integer id) {

this.id = id;

}

public Employee(Integer id, String name) {

this.id = id;

this.name = name;

}

public Integer getId() {

return id;

}

public void setId(Integer id) {

this.id = id;

}

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

public List<Shipment> getShipmentList() {

return shipmentList;

}

public void setShipmentList(List<Shipment> shipmentList) {

this.shipmentList = shipmentList;

}

@Override

public int hashCode() {

int hash = 0;

hash += (id != null ? id.hashCode() : 0);

return hash;

}

@Override

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)) {

return false;

}

Employee other = (Employee) object;

if ((this.id == null && other.id != null) || (this.id != null && !this.id.equals(other.id))) {

return false;

}

return true;

}

@Override

public String toString() {

return name;

}

}

/*

* To change this template, choose Tools | Templates

* and open the template in the editor.

*/

package Entities;

import java.io.Serializable;

import java.util.ArrayList;

import java.util.List;

import javax.persistence.Basic;

import javax.persistence.CascadeType;

import javax.persistence.Column;

import javax.persistence.Entity;

import javax.persistence.GeneratedValue;

import javax.persistence.GenerationType;

import javax.persistence.Id;

import javax.persistence.NamedQueries;

import javax.persistence.NamedQuery;

import javax.persistence.OneToMany;

import javax.persistence.Table;

/**

*

* @author Humanity

*/

@Entity

@Table(name = "PRODUCT")

@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;

@Id

@GeneratedValue(strategy = GenerationType.IDENTITY)

@Basic(optional = false)

@Column(name = "ID")

private Integer id;

@Basic(optional = false)

@Column(name = "NAME")

private String name;

@Column(name = "MANUFACTURER")

private String manufacturer;

@Basic(optional = false)

@Column(name = "QUANTITYINSTOCK")

private int quantityinstock;

@OneToMany(cascade = CascadeType.ALL, mappedBy = "productid")

private List<Shipment> shipmentList;

public Product() {

}

public Product(Integer id) {

this.id = id;

this.shipmentList = new ArrayList<Shipment>();

}

public Product(Integer id, String name, int quantityinstock) {

this.id = id;

this.name = name;

this.quantityinstock = quantityinstock;

this.shipmentList = new ArrayList<Shipment>();

}

public Product(Integer id, String name, String manufacturer, int quantityinstock) {

this.id = id;

this.name = name;

this.manufacturer = manufacturer;

this.quantityinstock = quantityinstock;

this.shipmentList = new ArrayList<Shipment>();

}

public Integer getId() {

return id;

}

public void setId(Integer id) {

this.id = id;

}

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

public String getManufacturer() {

return manufacturer;

}

public void setManufacturer(String manufacturer) {

this.manufacturer = manufacturer;

}

public int getQuantityinstock() {

return quantityinstock;

}

public void setQuantityinstock(int quantityinstock) {

this.quantityinstock = quantityinstock;

}

public List<Shipment> getShipmentList() {

return shipmentList;

}

public void setShipmentList(List<Shipment> shipmentList) {

this.shipmentList = shipmentList;

}

@Override

public int hashCode() {

int hash = 0;

hash += (id != null ? id.hashCode() : 0);

return hash;

}

@Override

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)) {

return false;

}

Product other = (Product) object;

if ((this.id == null && other.id != null) || (this.id != null && !this.id.equals(other.id))) {

return false;

}

return true;

}

@Override

public String toString() {

return name;

}

}

/*

* To change this template, choose Tools | Templates

* and open the template in the editor.

*/

package Entities;

import java.io.Serializable;

import java.util.Date;

import javax.persistence.Basic;

import javax.persistence.Column;

import javax.persistence.Entity;

import javax.persistence.GeneratedValue;

import javax.persistence.GenerationType;

import javax.persistence.Id;

import javax.persistence.JoinColumn;

import javax.persistence.ManyToOne;

import javax.persistence.NamedQueries;

import javax.persistence.NamedQuery;

import javax.persistence.Table;

import javax.persistence.Temporal;

import javax.persistence.TemporalType;

/**

*

* @author Humanity

*/

@Entity

@Table(name = "SHIPMENT")

@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;

@Id

@GeneratedValue(strategy = GenerationType.IDENTITY)

@Basic(optional = false)

@Column(name = "ID")

private Integer id;

@Basic(optional = false)

@Column(name = "QUANTITY")

private int quantity;

@Column(name = "DATETIME")

@Temporal(TemporalType.TIMESTAMP)

private Date datetime;

@JoinColumn(name = "RESPONSIBLEPERSONID", referencedColumnName = "ID")

@ManyToOne(optional = false)

private Employee responsiblepersonid;

@JoinColumn(name = "PRODUCTID", referencedColumnName = "ID")

@ManyToOne(optional = false)

private Product productid;

public Shipment() {

}

public Shipment(Integer id) {

this.id = id;

}

public Shipment(Integer id, int quantity) {

this.id = id;

this.quantity = quantity;

}

public Integer getId() {

return id;

}

public void setId(Integer id) {

this.id = id;

}

public int getQuantity() {

return quantity;

}

public void setQuantity(int quantity) {

this.quantity = quantity;

}

public Date getDatetime() {

return datetime;

}

public void setDatetime(Date datetime) {

this.datetime = datetime;

}

public Employee getResponsiblepersonid() {

return responsiblepersonid;

}

public void setResponsiblepersonid(Employee responsiblepersonid) {

this.responsiblepersonid = responsiblepersonid;

}

public Product getProductid() {

return productid;

}

public void setProductid(Product productid) {

this.productid = productid;

}

@Override

public int hashCode() {

int hash = 0;

hash += (id != null ? id.hashCode() : 0);

return hash;

}

@Override

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)) {

return false;

}

Shipment other = (Shipment) object;

if ((this.id == null && other.id != null) || (this.id != null && !this.id.equals(other.id))) {

return false;

}

return true;

}

@Override

public String toString() {

return "Entities.Shipment[id=" + id + "]";

}

}

Слой доступа к данным

/*

* To change this template, choose Tools | Templates

* and open the template in the editor.

*/

package DAL;

import Entities.Employee;

import java.util.List;

import javax.persistence.EntityManager;

import javax.persistence.EntityTransaction;

import javax.persistence.Query;

/**

*

* @author Humanity

*/

public class EmployeeRepository {

private EntityManager entityManager;

private String GetAllEmployeesQuery = "select e from Employee e";

public EmployeeRepository(EntityManager entityManager) {

this.entityManager = entityManager;

}

public List<Employee> GetAllEmployees() {

Query query = entityManager.createQuery(GetAllEmployeesQuery);

return query.getResultList();

}

public Employee GetEmployeeById(int employeeId) {

Employee employee = entityManager.find(Employee.class, employeeId);

return employee;

}

public void InsertEmployee(Employee employee) {

EntityTransaction t = entityManager.getTransaction();

t.begin();

try {

entityManager.persist(employee);

entityManager.flush();

t.commit();

} catch(Exception ex) {

t.rollback();

}

}

public void UpdateEmployee(Employee employee) {

EntityTransaction t = entityManager.getTransaction();

t.begin();

try {

entityManager.refresh(employee);

entityManager.flush();

t.commit();

} catch(Exception ex) {

t.rollback();

}

}

public void DeleteEmployee(int employeeId) {

EntityTransaction t = entityManager.getTransaction();

t.begin();

try {

Employee Employee = GetEmployeeById(employeeId);

entityManager.remove(Employee);

entityManager.flush();

t.commit();

} catch(Exception ex) {

t.rollback();

}

}

}

/*

* To change this template, choose Tools | Templates

* and open the template in the editor.

*/

package DAL;

import Entities.Product;

import java.util.List;

import javax.persistence.EntityManager;

import javax.persistence.EntityTransaction;

import javax.persistence.Query;

/**

*

* @author Humanity

*/

public class ProductRepository {

private EntityManager entityManager;

private String GetAllProductsQuery = "select p from Product p";

public ProductRepository(EntityManager entityManager) {

this.entityManager = entityManager;

}

public List<Product> GetAllProducts() {

Query query = entityManager.createQuery(GetAllProductsQuery);

return query.getResultList();

}

public Product GetProductById(int productId) {

Product product = entityManager.find(Product.class, productId);

return product;

}

public boolean InsertProduct(Product product) {

EntityTransaction t = entityManager.getTransaction();

t.begin();

try {

entityManager.merge(product);

//entityManager.persist(product);

t.commit();

return true;

} catch(Exception ex) {

t.rollback();

return false;

}

}

public void UpdateProduct(Product product) {

EntityTransaction t = entityManager.getTransaction();

t.begin();

try {

entityManager.refresh(product);

entityManager.flush();

t.commit();

} catch(Exception ex) {

t.rollback();

}

}

public void DeleteProduct(int productId) {

EntityTransaction t = entityManager.getTransaction();

t.begin();

try {

Product Product = GetProductById(productId);

entityManager.remove(Product);

entityManager.flush();

t.commit();

} catch(Exception ex) {

t.rollback();

}

}

}

/*

* To change this template, choose Tools | Templates

* and open the template in the editor.

*/

package DAL;

import Entities.Product;

import Entities.Shipment;

import java.lang.Math;

import java.util.List;

import javax.persistence.EntityManager;

import javax.persistence.EntityTransaction;

import javax.persistence.Query;

/**

*

* @author Humanity

*/

public class ShipmentRepository {

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<Shipment> GetAllShipments() {

Query query = entityManager.createQuery(GetAllShipmentsQuery);

return query.getResultList();

}

public Shipment GetShipmentById(int shipmentId) {

Shipment shipment = entityManager.find(Shipment.class, shipmentId);

return shipment;

}

public List<Shipment> GetShipmentForProduct(int productId) {

Query query = entityManager.createQuery(String.format(GetShipmentsForProductQuery, productId));

return query.getResultList();

}

public List<Shipment> GetShipmentForPerson(int personId) {

Query query = entityManager.createQuery(String.format(GetShipmentsForPersonQuery, personId));

return query.getResultList();

}

public List<Shipment> GetShipmentList(int personId, int productId) {

if (productId == 0){

if (personId == 0) {

return GetAllShipments();

} else {

return GetShipmentForPerson(personId);

}

} else {

if (personId == 0) {

return GetShipmentForProduct(productId);

} else {

Query query = entityManager.createQuery(String.format(GetShipmentsForPersonAndProductQuery, personId, productId));

return query.getResultList();

}

}

}

public boolean InsertShipment(Shipment shipment) {

Product p = StockDatabase.getInstance().getProducts().GetProductById(shipment.getProductid().getId());

if (shipment.getQuantity() < 0 &&

p.getQuantityinstock() < Math.abs(shipment.getQuantity())) {

// trying to take TOO MUCH from stock...

return false;

}

int finalQuantity = p.getQuantityinstock() + shipment.getQuantity();

p.setQuantityinstock(finalQuantity);

EntityTransaction t = entityManager.getTransaction();

try {

t.begin();

entityManager.persist(shipment);

entityManager.persist(p);

//entityManager.flush();

t.commit();

return true;

} catch(Exception ex) {

t.rollback();

return false;

}

}

public void UpdateShipment(Shipment shipment) {

EntityTransaction t = entityManager.getTransaction();

t.begin();

try {

entityManager.refresh(shipment);

entityManager.flush();

t.commit();

} catch(Exception ex) {

t.rollback();

}

}

public void DeleteShipment(int shipmentId) {

EntityTransaction t = entityManager.getTransaction();

t.begin();

try {

Shipment Shipment = GetShipmentById(shipmentId);

entityManager.remove(Shipment);

entityManager.flush();

t.commit();

} catch(Exception ex) {

t.rollback();

}

}

}

/*

* To change this template, choose Tools | Templates

* and open the template in the editor.

*/

package DAL;

import javax.persistence.EntityManager;

import javax.persistence.EntityManagerFactory;

import javax.persistence.Persistence;

/**

*

* @author Humanity

*/

public class StockDatabase {

private static class SingletonHolder {

public static StockDatabase instance = new StockDatabase();

}

public static StockDatabase getInstance() {

return SingletonHolder.instance;

}

private String connectionName = "StockDb";

private EntityManager entityManager;

EmployeeRepository employee;

ProductRepository products;

ShipmentRepository shipments;

protected StockDatabase() {

try {

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) {

Throwable a = ex.getException();

Throwable b = ex.getCause();

}

}

public EmployeeRepository getEmployee() {

return employee;

}

public ProductRepository getProducts() {

return products;

}

public ShipmentRepository getShipments() {

return shipments;

}

}

Классы пользовательского интерфейса

/*

* StockView.java

*/

package stock;

import DAL.StockDatabase;

import Entities.Employee;

import Entities.Product;

import Entities.Shipment;

import Utils.Utils;

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.ActionEvent;

import java.awt.event.ActionListener;

import java.util.ArrayList;

import java.util.List;

import javax.swing.ComboBoxModel;

import javax.swing.DefaultComboBoxModel;

import javax.swing.Timer;

import javax.swing.Icon;

import javax.swing.JDialog;

import javax.swing.JFrame;

import javax.swing.table.DefaultTableModel;

import javax.swing.table.TableModel;

/**

* The application's main frame.

*/

public class StockView extends FrameView {

public StockView(SingleFrameApplication app) {

super(app);

initComponents();

// 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) {

//statusMessageLabel.setText("");

}

});

messageTimer.setRepeats(false);

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);

//progressBar.setVisible(false);

// 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)) {

if (!busyIconTimer.isRunning()) {

statusAnimationLabel.setIcon(busyIcons[0]);

busyIconIndex = 0;

busyIconTimer.start();

}

progressBar.setVisible(true);

progressBar.setIndeterminate(true);

} else if ("done".equals(propertyName)) {

busyIconTimer.stop();

statusAnimationLabel.setIcon(idleIcon);

progressBar.setVisible(false);

progressBar.setValue(0);

} else if ("message".equals(propertyName)) {

String text = (String)(evt.getNewValue());

statusMessageLabel.setText((text == null) ? "" : text);

messageTimer.restart();

} else if ("progress".equals(propertyName)) {

int value = (Integer)(evt.getNewValue());

progressBar.setVisible(true);

progressBar.setIndeterminate(false);

progressBar.setValue(value);

}*/

}

});

//setResizable(false);

tableProducts.getColumnModel().getColumn(0).setMinWidth(0);

tableProducts.getColumnModel().getColumn(0).setMaxWidth(0);

tableProducts.getColumnModel().getColumn(0).setWidth(0);

RefillProductsTable();

RefillShipmentTable();

}

private void RefillProductsTable() {

List<Product> products = StockDatabase.getInstance().getProducts().GetAllProducts();

DefaultTableModel model = (DefaultTableModel) tableProducts.getModel();

model.setRowCount(0);

for(Product product : products){

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<Shipment> shipments) {

DefaultTableModel model = (DefaultTableModel) tableShipments.getModel();

model.setRowCount(0);

for(Shipment shipment : shipments){

model.addRow(new Object[]{

Utils.convertDateToDateString(shipment.getDatetime()),

shipment.getProductid(),

shipment.getQuantity(),

shipment.getResponsiblepersonid() });

}

}

protected ComboBoxModel getEmployeeModel() {

List<Employee> people = StockDatabase.getInstance().getEmployee().GetAllEmployees();

people.add(0, new Employee(0, "No filter"));

ComboBoxModel model = new DefaultComboBoxModel(people.toArray());

return model;

}

protected ComboBoxModel getProductsModel() {

List<Product> products = StockDatabase.getInstance().getProducts().GetAllProducts();

products.add(0, new Product(0, "No filter", 0));

ComboBoxModel model = new DefaultComboBoxModel(

products.toArray());

return model;

}

@Action

public void showAboutBox() {

if (aboutBox == null) {

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

* initialize the form.

* WARNING: Do NOT modify this code. The content of this method is

* always regenerated by the Form Editor.

*/

@SuppressWarnings("unchecked")

// <editor-fold defaultstate="collapsed" desc="Generated Code">

private void initComponents() {

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();

btnAddProduct = new javax.swing.JButton();

jPanel1 = new javax.swing.JPanel();

btnIncoming = new javax.swing.JButton();

btnOutcoming = new javax.swing.JButton();

jScrollPane2 = new javax.swing.JScrollPane();

tableShipments = new javax.swing.JTable();

dropdownEmployeeFilter = new javax.swing.JComboBox();

jLabel1 = new javax.swing.JLabel();

jButton2 = new javax.swing.JButton();

dropdownProductFilter = new javax.swing.JComboBox();

jPopupMenu = new javax.swing.JPopupMenu();

jMenuItem1 = new javax.swing.JMenuItem();

mainPanel.setMinimumSize(new java.awt.Dimension(507, 434));

mainPanel.setName("mainPanel"); // NOI18N

org.jdesktop.beansbinding.Binding binding = org.jdesktop.beansbinding.Bindings.createAutoBinding(org.jdesktop.beansbinding.AutoBinding.UpdateStrategy.READ_WRITE, jPopupMenu, org.jdesktop.beansbinding.ObjectProperty.create(), mainPanel, org.jdesktop.beansbinding.BeanProperty.create("componentPopupMenu"));

bindingGroup.addBinding(binding);

jTabbedPane1.setName("jTabbedPane1"); // NOI18N

binding = org.jdesktop.beansbinding.Bindings.createAutoBinding(org.jdesktop.beansbinding.AutoBinding.UpdateStrategy.READ_WRITE, jPopupMenu, org.jdesktop.beansbinding.ObjectProperty.create(), jTabbedPane1, org.jdesktop.beansbinding.BeanProperty.create("componentPopupMenu"));

bindingGroup.addBinding(binding);

jTabbedPane1.addFocusListener(new java.awt.event.FocusAdapter() {

public void focusGained(java.awt.event.FocusEvent evt) {

jTabbedPane1FocusGained(evt);

}

});

jPanel2.setName("jPanel2"); // NOI18N

jScrollPane1.setName("jScrollPane1"); // NOI18N

tableProducts.setModel(new javax.swing.table.DefaultTableModel(

new Object [][] {

},

new String [] {

"ProductObject", "ID", "Name", "Manufacturer", "Quantity In Stock"

}

) {

Class[] types = new Class [] {

java.lang.Object.class, java.lang.Integer.class, java.lang.Object.class, java.lang.String.class, java.lang.Integer.class

};

boolean[] canEdit = new boolean [] {

false, false, false, false, false

};

public Class getColumnClass(int columnIndex) {

return types [columnIndex];

}

public boolean isCellEditable(int rowIndex, int columnIndex) {

return canEdit [columnIndex];

}

});

tableProducts.setName("tableProducts"); // NOI18N

jScrollPane1.setViewportView(tableProducts);

org.jdesktop.application.ResourceMap resourceMap = org.jdesktop.application.Application.getInstance(stock.StockApp.class).getContext().getResourceMap(StockView.class);

tableProducts.getColumnModel().getColumn(0).setResizable(false);

tableProducts.getColumnModel().getColumn(0).setPreferredWidth(0);

tableProducts.getColumnModel().getColumn(0).setHeaderValue(resourceMap.getString("tableProducts.columnModel.title4")); // NOI18N

tableProducts.getColumnModel().getColumn(1).setPreferredWidth(50);

tableProducts.getColumnModel().getColumn(1).setHeaderValue(resourceMap.getString("tableProducts.columnModel.title0")); // NOI18N

tableProducts.getColumnModel().getColumn(2).setHeaderValue(resourceMap.getString("tableProducts.columnModel.title1")); // NOI18N

tableProducts.getColumnModel().getColumn(3).setHeaderValue(resourceMap.getString("tableProducts.columnModel.title2")); // NOI18N

tableProducts.getColumnModel().getColumn(4).setHeaderValue(resourceMap.getString("tableProducts.columnModel.title3")); // NOI18N

btnRefresh.setText(resourceMap.getString("btnRefresh.text")); // NOI18N

btnRefresh.setName("btnRefresh"); // NOI18N

btnRefresh.addMouseListener(new java.awt.event.MouseAdapter() {

public void mouseClicked(java.awt.event.MouseEvent evt) {

btnRefreshMouseClicked(evt);

}

});

btnAddProduct.setText(resourceMap.getString("btnAddProduct.text")); // NOI18N

btnAddProduct.setName("btnAddProduct"); // NOI18N

btnAddProduct.addMouseListener(new java.awt.event.MouseAdapter() {

public void mouseClicked(java.awt.event.MouseEvent evt) {

btnAddProductMouseClicked(evt);

}

});

javax.swing.GroupLayout jPanel2Layout = new javax.swing.GroupLayout(jPanel2);

jPanel2.setLayout(jPanel2Layout);

jPanel2Layout.setHorizontalGroup(

jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)

.addGroup(javax.swing.GroupLayout.Alignment.TRAILING, jPanel2Layout.createSequentialGroup()

.addContainerGap()

.addGroup(jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)

.addComponent(jScrollPane1, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, 487, Short.MAX_VALUE)

.addGroup(jPanel2Layout.createSequentialGroup()

.addComponent(btnAddProduct)

.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 313, Short.MAX_VALUE)

.addComponent(btnRefresh)))

.addContainerGap())

);

jPanel2Layout.setVerticalGroup(

jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)

.addGroup(javax.swing.GroupLayout.Alignment.TRAILING, jPanel2Layout.createSequentialGroup()

.addContainerGap()

.addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 379, Short.MAX_VALUE)

.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)

.addGroup(jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)

.addComponent(btnRefresh)

.addComponent(btnAddProduct))

.addContainerGap())

);

jTabbedPane1.addTab(resourceMap.getString("jPanel2.TabConstraints.tabTitle"), jPanel2); // NOI18N

jPanel1.setName("jPanel1"); // NOI18N

btnIncoming.setText(resourceMap.getString("btnIncoming.text")); // NOI18N

btnIncoming.setName("btnIncoming"); // NOI18N

btnIncoming.addMouseListener(new java.awt.event.MouseAdapter() {

public void mouseClicked(java.awt.event.MouseEvent evt) {

btnIncomingMouseClicked(evt);

}

});

btnOutcoming.setText(resourceMap.getString("btnOutcoming.text")); // NOI18N

btnOutcoming.setName("btnOutcoming"); // NOI18N

btnOutcoming.addMouseListener(new java.awt.event.MouseAdapter() {

public void mouseClicked(java.awt.event.MouseEvent evt) {

btnOutcomingMouseClicked(evt);

}

});

jScrollPane2.setName("jScrollPane2"); // NOI18N

tableShipments.setModel(new javax.swing.table.DefaultTableModel(

new Object [][] {

},

new String [] {

"Date and time", "Product", "Quantity", "Responsible Person"

}

));

tableShipments.setName("tableShipments"); // NOI18N

jScrollPane2.setViewportView(tableShipments);

dropdownEmployeeFilter.setModel(getEmployeeModel());

dropdownEmployeeFilter.setMaximumSize(new java.awt.Dimension(100, 20));

dropdownEmployeeFilter.setMinimumSize(new java.awt.Dimension(100, 20));

dropdownEmployeeFilter.setName("dropdownEmployeeFilter"); // NOI18N

dropdownEmployeeFilter.setPreferredSize(new java.awt.Dimension(100, 20));

jLabel1.setText(resourceMap.getString("jLabel1.text")); // NOI18N

jLabel1.setName("jLabel1"); // NOI18N

jButton2.setText(resourceMap.getString("jButton2.text")); // NOI18N

jButton2.setName("jButton2"); // NOI18N

jButton2.addMouseListener(new java.awt.event.MouseAdapter() {

public void mouseClicked(java.awt.event.MouseEvent evt) {

jButton2MouseClicked(evt);

}

});

dropdownProductFilter.setModel(getProductsModel());

dropdownProductFilter.setMaximumSize(new java.awt.Dimension(100, 20));

dropdownProductFilter.setMinimumSize(new java.awt.Dimension(100, 20));

dropdownProductFilter.setName("dropdownProductFilter"); // NOI18N

dropdownProductFilter.setPreferredSize(new java.awt.Dimension(100, 20));

javax.swing.GroupLayout jPanel1Layout = new javax.swing.GroupLayout(jPanel1);

jPanel1.setLayout(jPanel1Layout);

jPanel1Layout.setHorizontalGroup(

jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)

.addGroup(jPanel1Layout.createSequentialGroup()

.addContainerGap()

.addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)

.addComponent(jScrollPane2, javax.swing.GroupLayout.DEFAULT_SIZE, 487, Short.MAX_VALUE)

.addGroup(jPanel1Layout.createSequentialGroup()

.addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)

.addGroup(jPanel1Layout.createSequentialGroup()

.addComponent(btnIncoming)

.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)

.addComponent(btnOutcoming))

.addGroup(javax.swing.GroupLayout.Alignment.TRAILING, jPanel1Layout.createSequentialGroup()

.addComponent(jLabel1)

.addGap(81, 81, 81)

.addComponent(dropdownProductFilter, javax.swing.GroupLayout.PREFERRED_SIZE, 145, javax.swing.GroupLayout.PREFERRED_SIZE)

.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)

.addComponent(dropdownEmployeeFilter, javax.swing.GroupLayout.PREFERRED_SIZE, 145, javax.swing.GroupLayout.PREFERRED_SIZE)))

.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)

.addComponent(jButton2)))

.addContainerGap())

);

jPanel1Layout.setVerticalGroup(

jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)

.addGroup(jPanel1Layout.createSequentialGroup()

.addContainerGap()

.addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)

.addComponent(jLabel1)

.addComponent(jButton2)

.addComponent(dropdownEmployeeFilter, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)

.addComponent(dropdownProductFilter, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))

.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)

.addComponent(jScrollPane2, javax.swing.GroupLayout.DEFAULT_SIZE, 350, Short.MAX_VALUE)

.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)

.addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)

.addComponent(btnIncoming)

.addComponent(btnOutcoming))

.addContainerGap())

);

jTabbedPane1.addTab(resourceMap.getString("jPanel1.TabConstraints.tabTitle"), jPanel1); // NOI18N

javax.swing.GroupLayout mainPanelLayout = new javax.swing.GroupLayout(mainPanel);

mainPanel.setLayout(mainPanelLayout);

mainPanelLayout.setHorizontalGroup(

mainPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)

.addGroup(javax.swing.GroupLayout.Alignment.TRAILING, mainPanelLayout.createSequentialGroup()

.addContainerGap()

.addComponent(jTabbedPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 512, Short.MAX_VALUE)

.addContainerGap())

);

mainPanelLayout.setVerticalGroup(

mainPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)

.addGroup(mainPanelLayout.createSequentialGroup()

.addContainerGap()

.addComponent(jTabbedPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 458, Short.MAX_VALUE)

.addContainerGap())

);

jPopupMenu.setName("jPopupMenu"); // NOI18N

javax.swing.ActionMap actionMap = org.jdesktop.application.Application.getInstance(stock.StockApp.class).getContext().getActionMap(StockView.class, this);

jMenuItem1.setAction(actionMap.get("showAboutBox")); // NOI18N

jMenuItem1.setName("jMenuItem1"); // NOI18N

jPopupMenu.add(jMenuItem1);

setComponent(mainPanel);

bindingGroup.bind();

}// </editor-fold>

private void btnRefreshMouseClicked(java.awt.event.MouseEvent evt) {

// TODO add your handling code here:

RefillProductsTable();

}

private void btnIncomingMouseClicked(java.awt.event.MouseEvent evt) {

if (addShipmentBox == null) {

JFrame mainFrame = StockApp.getApplication().getMainFrame();

addShipmentBox = new AddShipmentDialog(mainFrame);

addShipmentBox.setLocationRelativeTo(mainFrame);

}

addShipmentBox.Initialize(true);

StockApp.getApplication().show(addShipmentBox);

RefillShipmentTable();

RefillProductsTable();

}

private void btnOutcomingMouseClicked(java.awt.event.MouseEvent evt) {

if (addShipmentBox == null) {

JFrame mainFrame = StockApp.getApplication().getMainFrame();

addShipmentBox = new AddShipmentDialog(mainFrame);


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

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