Файл: Разработка регламента выполнения процесса «Управление документооборотом».pdf

ВУЗ: Не указан

Категория: Курсовая работа

Дисциплина: Не указана

Добавлен: 29.02.2024

Просмотров: 43

Скачиваний: 0

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.

Альтернативная последовательность (Специалист не взял с собой пропуск):

  • Архивариус нажимает на кнопку «Отмена»;
  • Возвращает документ Специалисту.

Альтернативная последовательность (База данных недоступна):

  • Система открывает сообщение: «В данный момент работа в системе производится не может, т.к. база данных недоступна»;
  • Перенаправляет на главную страницу платформы.

Альтернативная последовательность (Архивариус выбирает часть листов):

  • Архивариус выбирает часть листов для выдачи;
  • Подтверждает выбор нажав на кнопку «Далее»;
  • Система открывает окно проверки пропуска;
  • Специалист прикладывает пропуск к датчику;
  • Система считывает данные пропуска;
  • Отображает имя специалиста в окне проверки пропуска;
  • Специалист нажимает на кнопку «Вернуть»;
  • Устанавливает фамилию, кто возвратил документ;
  • Устанавливает дату возврата;
  • Отмечает листы, которые вернул специалист.

Альтернативная последовательность (Специалист сдает больше 1 документа):

  • Архивариус выбирает другой документ в заявке;
  • Нажимает на кнопку «Вернуть».

Альтернативная последовательность (У специалиста больше 1 заявки):

  • Архивариус нажимает на кнопку «Поиск»;
  • Система открывает диалоговое окно поиска активной заявки по обозначению документа;
  • Архивариус вводит обозначение документа;
  • Нажимает на кнопку «Подтвердить»;
  • Система отфильтровывает заявки, в которых выдан документ с введённым обозначением;
  • Выделяет первую в списке заявку;
  • Загружает список документов по заявке.

Рис. 18. Возврат документов

Рис. 19. Окно поиска заявки по документу

Название прецедента: Регистрация технической документации

Действующее лицо: Оператор

Предусловия: Оператор авторизован и в браузере открыта страница ИС Архив

Краткое описание: Оператор открывает окно регистрации документа, заполняет его данными и подтверждает сохранение данных

Главная последовательность:

  • Оператор нажимает на кнопку «+»;
  • Система открывает окно регистрации документа;
  • Оператор вносит все необходимые данные;
  • Нажимает на кнопку «Подтвердить»;
  • Система проверяет наличие подобного документа в базе данных;
  • Заносит данные в базу данных;
  • Открывает сообщение: «Документ зарегистрирован».

Альтернативная последовательность (База данных недоступна):

  • Система открывает сообщение: «В данный момент работа в системе производится не может, т.к. база данных недоступна»;
  • Перенаправляет на главную страницу платформы.

Альтернативная последовательность (Документ уже есть в базе данных):

  • Система открывает сообщение: «Данный документ уже зарегистрирован».

Рис. 20. Регистрация технической документации

Рис. 21. Схема интерфейса техника

Рис. 22. Окно регистрации документа

База данных

Информационная система разрабатывается с использованием табличного пространства платформы «Базис» (таблицы с приставкой AP_). Включает в себя таблицу с пользователями, группами, ролями, правами доступа, задачами и т.д. Второе табличное пространство принадлежит разрабатываемой ИС Архив (таблицы с приставкой Z_ARCH_). Результирующее табличное пространство было получено путем нормализации таблицы изображенной на рисунке 23. База данных должна содержать информацию о различных технических документах, кто зарегистрировал и изменил запись в БД, кому выдан тот или иной экземпляр (при наличии нескольких экземпляров).

Рис. 23. Первоначальная таблица с данными о документах архива

На первом шаге произведено удаление повторяющихся групп.

Рис. 24. Таблица с данными о документах архива в 1 нормальной форме (НФ)

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

Рис. 25. Таблица с данными о документах архива в 2 НФ

Рис. 26. Таблица с данными о истории изменения записей в таблице с документами в 2 НФ

Рис. 27. Таблица с заявками на получение документов в 2 НФ


Рис. 28. Таблица с документами из заявок в 2 НФ

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

Рис. 29. Таблица с списками в 3 НФ

В ходе нормализации было получено 5 таблиц и 2 таблицы из табличного пространства платформы Базис:

  • Таблица AP_USERS – содержит информацию о пользователях платформы;
  • Таблица AP_GROUP – содержит информацию об организационном дереве (подразделениях);
  • Таблица Z_ARCH_DOC - главная таблица системы, содержит информацию о документах;
  • Таблица Z_ARCH_HISTORY - содержит информацию о истории изменений документов в БД;
  • Таблица Z_ARCH_REQ - содержит информацию о заявках пользователей на получение документов;
  • Таблица Z_ARCH_REQ_DOC - содержит информацию о документах, входящих в состав заявки;
  • Таблица Z_ARCH_LISTS - справочник возможных статусов документов, причин для получения документов, статусов заявок, видов документов, процессов, признаков, признаков применяемости.

Итоговый вариант схемы базы данных изображен на рисунке 30.

Рис. 30. Схема базы данных системы в 3 НФ

Заключение

В ходе выполнения работы были исследованы процессы регламента выполнения процесса «Управление документооборотом». Были проанализированы аналоги, рассмотрена платформа Базис и средства реализации, на основе которых сформулированы требования к разрабатываемой системе.

Разработанная ИС получила название «Архив» и была интегрирована в платформу Базис, благодаря использованию api и табличного пространства платформы.

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


Список ипользованной литературы

  1. ГОСТ 19.701-90 (ИСО 5807-85) ЕСПД. Схемы алгоритмов, программ, данных и систем. Условные обозначения и правила выполнения - Москва: Стандартинформ, 2010 – 23 с.
  2. Гери Д. JavaServer Faces. Библиотека профессионала, 3-е издание/ Хорстманн К. – Санкт-Петербург: Вильямс, 2011 – 544 с.
  3. Гупта А. Java EE 7. Основы - Санкт-Петербург: Вильямс, 2014 – 336 с.
  4. Закас Н. JavaScript для профессиональных веб-разработчиков. – Санкт-Петербург: Питер, 2015. – 960 с.
  5. Дело [Электронный ресурс] URL: https://www.eos.ru/eos_products/eos_delo/ (Дата обращения: 11.10.2018).
  6. СЭД "Е1 Евфрат". Схема оптимизации документооборота [Электронный ресурс] URL: http://www.evfrat.ru/about/
  7. Система электронного документооборота — СЭД ТЕЗИС [Электронный ресурс] URL: https://www.tezis-doc.ru/
  8. Аналитика. Автоматизация делопроизводства и документооборота уверенно занимает свою нишу в области систем автоматизации предприятия. DIRECTUM [Электронный ресурс] URL: https://www.directum.ru/339091.aspx
  9. Teamcenter [Электронный ресурс] URL: https://www.plm.automation.siemens.com/global/ru/products/teamcenter/ (Дата обращения: 01.10.2018).
  10. RabbitMQ - Messaging that just works [Электронный ресурс] URL: https://www.rabbitmq.com/

Приложение 1

Листинг сервлета GetMyReq.java

package arch.bum.doc;

import java.io.BufferedReader;

import java.io.IOException;

import java.io.InputStreamReader;

import java.io.PrintWriter;

import java.io.StringWriter;

import java.net.URL;

import java.net.URLConnection;

import java.net.URLEncoder;

import java.sql.Connection;

import java.sql.PreparedStatement;

import java.sql.ResultSet;

import javax.naming.Context;

import javax.naming.InitialContext;

import javax.servlet.ServletException;

import javax.servlet.annotation.WebServlet;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

import javax.sql.DataSource;

import org.json.simple.JSONArray;

import org.json.simple.JSONObject;

import org.json.simple.parser.JSONParser;

import platform.bazis.registr.Config;

/**

*

* @author bronnikov-ea

*/

@WebServlet(name = "GetMyReq", urlPatterns = {"/getmyreq"})

public class GetMyReq extends HttpServlet {

/**

* Processes requests for both HTTP <code>GET</code> and <code>POST</code>

* methods.

*

* @param request servlet request

* @param response servlet response

* @throws ServletException if a servlet-specific error occurs

* @throws IOException if an I/O error occurs

*/

protected void processRequest(HttpServletRequest request, HttpServletResponse response)

throws ServletException, IOException {

response.setContentType("text/html;charset=UTF-8");

try (PrintWriter out = response.getWriter()) {

out.println(this.get(request));

}

}

// <editor-fold defaultstate="collapsed" desc="HttpServlet methods. Click on the + sign on the left to edit the code.">

/**

* Handles the HTTP <code>GET</code> method.

*

* @param request servlet request

* @param response servlet response

* @throws ServletException if a servlet-specific error occurs

* @throws IOException if an I/O error occurs

*/

@Override

protected void doGet(HttpServletRequest request, HttpServletResponse response)


throws ServletException, IOException {

processRequest(request, response);

}

/**

* Handles the HTTP <code>POST</code> method.

*

* @param request servlet request

* @param response servlet response

* @throws ServletException if a servlet-specific error occurs

* @throws IOException if an I/O error occurs

*/

@Override

protected void doPost(HttpServletRequest request, HttpServletResponse response)

throws ServletException, IOException {

processRequest(request, response);

}

/**

* Returns a short description of the servlet.

*

* @return a String containing servlet description

*/

@Override

public String getServletInfo() {

return "Short description";

}// </editor-fold>

private JSONArray get(HttpServletRequest request) {

String id_usr=null;

Config c=new Config();

try{

URL url = new URL(c.getUrl() + "/users?act=my_id&JSESSIONID=" + request.getSession().getId());

URLConnection con = url.openConnection();

BufferedReader in = new BufferedReader(new InputStreamReader(con.getInputStream()));

String inputLine = null;

String id = "";

while ((inputLine = in.readLine()) != null) {

id = id + inputLine;

}

JSONParser parser = new JSONParser();

JSONObject jsonObj = (JSONObject)parser.parse(id);

id_usr = "" + jsonObj.get("id");

} catch (Exception e) {

StringWriter sw = new StringWriter();

PrintWriter pw = new PrintWriter(sw);

e.printStackTrace(pw);

String act = "new";

String e_code = "1";

String task_id = "301";

String func_id = "381";

String e_class = this.getServletName();

String user_ua = "";

String user_ip = "";

String e_text = e.getMessage();

String e_level = "0";

String trace = "";

for (int i = 0; i < sw.toString().length(); i++) {

if (i > 3998) {

break;

}

trace = trace + sw.toString().charAt(i);

}

String e_trace = trace;

try {

http.sendErrorPost("http://bazis:7002/api/errors",

"e_code=" + e_code + "&task_id=" + task_id + "&e_class=" + e_class + "&func_id=" +

func_id + "&user_ua=" + user_ua + "&user_ip=" + user_ip + "&e_text=" +

URLEncoder.encode(e_text, "utf-8") + "&e_level=" + e_level + "&e_trace=" +

URLEncoder.encode(e_trace, "utf-8") + "&act=" + act, request);

} catch (Exception e2) {

e.printStackTrace();

}

}

JSONArray res=new JSONArray();

Context ctx = null;

Connection con = null;

DataSource ds = null;

PreparedStatement ps = null;

ResultSet rs=null;

try{

ctx = new InitialContext();

ds = (DataSource) ctx.lookup(c.getJndi());

con = ds.getConnection();

ps=con.prepareStatement("Select Z_ARCH_REQ.ID_USER_OT,Z_ARCH_REQ.ID_STATUS,Z_ARCH_REQ.ID,Z_ARCH_REQ.DATE_SOST,AP_USERS.NAME_1,AP_USERS.NAME_2,AP_USERS.NAME_3,AP_GROUP.GROUP_NAME,"

+ "z_arch_req_status.NAME as STATUS,Z_ARCH_REQ_PRICH.NAME as PRICHINA,Z_ARCH_REQ.DATE_II,Z_ARCH_REQ.N_II "

+ " from Z_ARCH_REQ,Z_ARCH_REQ_PRICH,z_arch_req_status,ap_group,ap_users "

+ " where Z_ARCH_REQ.ID_STATUS=z_arch_req_status.ID and AP_GROUP.ID=Z_ARCH_REQ.ID_GROUP and AP_USERS.ID=Z_ARCH_REQ.ID_USER_OT "

+ " and Z_ARCH_REQ_PRICH.ID=Z_ARCH_REQ.ID_PRICHINA and Z_ARCH_REQ.ID_USER_OT=? and z_arch_req_status.ID!=5"

+ " order by Z_ARCH_REQ.ID_STATUS,Z_ARCH_REQ.DATE_SOST");

ps.setString(1,id_usr);

rs=ps.executeQuery();

while(rs.next()){

JSONObject jo=new JSONObject();

jo.put("ID",rs.getString("ID"));

jo.put("ID_USER_OT",rs.getString("ID_USER_OT"));

jo.put("DATE_SOST",rs.getDate("DATE_SOST").getTime());

jo.put("GROUP",rs.getString("GROUP_NAME"));

jo.put("USER_OT",rs.getString("NAME_1")+" "+rs.getString("NAME_2").charAt(0)+"."+rs.getString("NAME_3").charAt(0)+".");

jo.put("PRICHINA",rs.getString("PRICHINA"));

jo.put("STATUS",rs.getString("STATUS"));

jo.put("N_II",rs.getString("N_II"));

jo.put("DATE_II",(rs.getString("DATE_II")!=null)?rs.getDate("DATE_II").getTime():null);

res.add(jo);

String id=rs.getString("ID");

String id_status=rs.getString("ID_STATUS");