Научная статья на тему 'АВТОМАТИЗАЦИЯ ДЕЯТЕЛЬНОСТИ ПОЛИКЛИНИКИ НА ОСНОВЕ ОБЪЕКТНО- ОРИЕНТИРОВАННОГО ПОДХОДА'

АВТОМАТИЗАЦИЯ ДЕЯТЕЛЬНОСТИ ПОЛИКЛИНИКИ НА ОСНОВЕ ОБЪЕКТНО- ОРИЕНТИРОВАННОГО ПОДХОДА Текст научной статьи по специальности «Компьютерные и информационные науки»

CC BY
120
21
i Надоели баннеры? Вы всегда можете отключить рекламу.
Ключевые слова
PYTHON / ПРЕДМЕТНАЯ ОБЛАСТЬ / ПОЛИКЛИНИКА / ПРОГРАММИРОВАНИЕ / SUBJECT AREA / CLINIC / PROGRAMMING

Аннотация научной статьи по компьютерным и информационным наукам, автор научной работы — Поварницын Е.Н.

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

i Надоели баннеры? Вы всегда можете отключить рекламу.
iНе можете найти то, что вам нужно? Попробуйте сервис подбора литературы.
i Надоели баннеры? Вы всегда можете отключить рекламу.

AUTOMATION OF POLYCLINIC ACTIVITIES BASED ON AN OBJECT-ORIENTED APPROACH

The article is devoted to the subject area of polyclinics. As well as developing a program in this area in the Python programming language.

Текст научной работы на тему «АВТОМАТИЗАЦИЯ ДЕЯТЕЛЬНОСТИ ПОЛИКЛИНИКИ НА ОСНОВЕ ОБЪЕКТНО- ОРИЕНТИРОВАННОГО ПОДХОДА»

УДК 004.6

Поварницын Е.Н. студент 4 курса

факультет «Информационные системы и технологии» Северный Арктический Федеральный Университет

Россия, г. Архангельск

АВТОМАТИЗАЦИЯ ДЕЯТЕЛЬНОСТИ ПОЛИКЛИНИКИ НА

ОСНОВЕ ОБЪЕКТНО- ОРИЕНТИРОВАННОГО ПОДХОДА

Аннотация: Статья посвящается рассмотрению предметной области поликлиники. А также разработка программы по данной области на языке программирования Python.

Ключевые слова: Python, предметная область, поликлиника, программирование.

Povarnitsyn E. N. student 4rd year

faculty of Information systems and technologies» Northern Arctic Federal University Russia, Arkhangelsk

AUTOMATION OF POLYCLINIC ACTIVITIES BASED ON AN OBJECT-ORIENTED APPROACH

Annotation: The article is devoted to the subject area of polyclinics. As well as developing a program in this area in the Python programming language.

Keyword: Python, subject area, clinic, programming.

1 ПРЕДМЕТНАЯ ОБЛАСТЬ

1.1 Вербальное описание

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

В ее функции входят:

а) оказание первой медицинской помощи при острых и внезапных

заболеваниях, травмах;

б) лечение больных при обращении в поликлинику и на дому;

в) организация и проведение диспансеризации;

г) экспертиза временной нетрудоспособности;

д) освобождение больных от работы;

е) направление на врачебно-трудовую экспертную комиссию лиц с признаками стойкой утраты трудоспособности;

ж) направление больных на санаторно-курортное лечение;

з) своевременная госпитализация нуждающихся в стационарном лечении.

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

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

Информация на каждого врача, а именно имя, фамилия отчество, дата рождения, специальность, квалификация и должность расположена в архиве поликлиники.

1.2 Концептуальное описание

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

Наименование объекта Свойства объекта

Пациент Имя пациента

Фамилия пациента

Возраст пациента

Лечащий врач

Врач Имя врача

Фамилия врача

Специальность врача

Болезнь Наименование - Гастрит - Язва - Порок сердца - Сотрясение мозга - Простуда - Коронавирус - Ухудшение зрения - Потеря уха - Болезней нет

Специальность врача Наименование - Глав врач - Кардиолог - Гастроэнтеролог - Терапевт - Окулист - Лор

Визит Пациент

Врач

Болезнь

Определяем ограничения:

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

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

- действия добавления, чтения, редактирования происходить если есть соединение с базой.

Схема взаимодействий представлена на рисунке 1

пациент, врач или та специальность, и удаления может

РИСУНОК 1 - ВЗАИМОДЕЙСТВИЕ ОБЪЕКТОВ

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

2 РАЗРАБОТКА ПРОГРАММНЫХ МОДУЛЕЙ

Для примера будет взята реализация страницы визита пациентов к врачам. Для этого создаём ру файл. Здесь необходимо реализовать для начала счётчик ИД. Он будет выглядеть в соответствии с рисунком 2.

с^ пехНс!' : : §1оЬа1 _пех! _г»е*± += 1 ге1:игп пех!

РИСУНОК 2 - СЧЁТЧИК ИД

Здесь будет реализоваться глобальная переменная _иех1 и метод, который будет прибавлять +1 при каждом его вызове.

Далее рассмотрим класс Visit, данный класс будет хранить объекты, такие как ИД посещения, пациента, врача и болезнь. Данные объекты создадим приватными, а также добавим сеттеры для данных объектов и setter'ы, которые позволят обращаться к объектам как к функциям. Для Id необходимы сеттеры для последующего тестирования методов в системе. Выглядеть это будет в соответствии с рисунком 3.

class Visit(obiect):

def (self, pacient, doctor, bolezn):

« 1 ЛЛЛЛЛЛЛЛЛЛrf

self._id = _nextld()

self- pacient = pacient

-W/vWvVvWv 1

self._doctor = doctor

self- bolezn = bolezn

(¡¡¡p^cpe'ty def id(self):

return self._id

(Sid .setter

def id(selfj value): self,_id = value

(¡¡¡property

def gacierrt(self):

return sel~._pacient

I

^¡¡pacient.setter

def pacientfself. value):

fiVvWvWvWi * '

sel~, pacient = value

IbWVWWVWV

РИСУНОК 3 - КЛАСС VISIT

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

class AbststactModelDatabase(obiect):

чллллллллллллллл 4 —1 '

_(self):

self.listeners = [

def addl_istener(self. listenerFunc) :

AWAW/vVvWvVvVv\ 4 ' WAWAW^WAWA^'

sel~.listeners.append(listenerFunc)

def removeListenerfielf. listenerFuric) :

AWAWAWAWAWAWv 4 iW/iVAVAWAWWV '

sel~.listeners.remove(listenerFunc)

def updatefself):

for eachFunc in self .listeners: eachFunc(self^

РИСУНОК 4 - АБСТРАКТНЫЙ КЛАСС

Далее можно создавать класс, который будет взаимодействовать с базой,

методе_тй_следует прописать ссылку на класс, индекс, равный 0, что

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

(self):

super(VisitDB, self). ()

self.index = 0

self.file = 'WVisitOE.pkl'

iНе можете найти то, что вам нужно? Попробуйте сервис подбора литературы.

self,doctorPath = 'WDoctorDE.pkl'

self.pacientPath = '\VPacientDB.pkl'

¡^^WWr............................................г

self,boleznPath = 'WBoleznDB.pkl'

vWvVvWvVv vWvVvWvV. Г

self.mainDirectory = Path(_file_).parent.parent

self.file = str(self.mainDirectory) +■ self.file

self, doctorPath = str (self .ma in Directory) -I- self .doctorPath

self.pacientPath = str(self.mainDirectory) + self.pacientPath

self,boleznPath = str(self.mainDirectory) -I- self .boleznPath

self.db = {}

self,doctors = {}

self .pacients = iV

WvWvWvWvW J

self.bDlezns = {}

РИСУНОК 5 - ОБОЗНАЧЕНИЕ БАЗЫ

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

def open_db(self):

with open(self.file, 1rb') as file: sel-.db = pickle.load(file)

def open_doctor_db(self) :

with open(self.doctorPath, 'rb') as file: sel~.doctors - pickle.load(file)

def open_jjaciervts_db( self) :

with open(self.pacientPath, 'rb') as file: sel~.pacients = pickle.load(file)

KVvWvVwWvW 1 »

def open_bglezris_db(self) :

with open(self.boleznPathj 'rb') as file: sel-.bolezns = pickle.load(file)

vWvVvVvVvW I *

def save_db(self):

with open(self.file, 'wb') as file: pickle.dump(sel~.dbj file)

РИСУНОК 6 - ЧТЕНИЕ И ЗАПИСЬ ДАННЫХ

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

def add(self. pacient. doctor.bolezn):

visit = Visit(pacient, doctor, bolezn) if visit.id in sel-.db:

visit.id = list(self.db.keys() )[ -1] -I- 1 sel~ ,,db[visit, id] = visit sel".index = listfself.db.keys())[-l] sel~ ,,update() sel".save_db(}

РИСУНОК 7 - ДОБАВЛЕНИЕ ДАННЫХ

Кнопки далее и назад будут иметь схожий код, поэтому рассмотрим их обобщенно. Если данных методах будет происходить ошибка, то выйдет окно о том, что эта страница либо последняя, либо первоначальная. Если же массив индекса будет равен ключу данных базы, то данные поменяются на следующие или же возвратятся назад. Код кнопки next будет выглядеть в соответствии с рисунком 8.

def next(self):

if self.index == list(self.db.keysQ>[ 1]: raise Except ion ('"После дня я страница") else:

try:

sel~.index = sel~.index + 1

while self.index <= list(sel~.db.keysQ)[-l] and self.index not in sel~.db.keysQ:

self, index = self . index -I- 1 sel~.update()

return self.db[self.index] except Exception:

raise Exception("Последняя страница")

РИСУНОК 8 - МЕТОД СЛЕДУЮЩЕЙ СТРАНИЦЫ

Далее рассмотрим метод удаления, в нём просто передаётся ИД посещения и через него удаляются данные, код выглядит в соответствии с рисунком 9. _

def delete(self, id):

i vW\ r

del self.db[id] sel~.save_db()

sel-,index = list(self.db.keys())[B] sel~ ,,update()

РИСУНОК 9 - МЕТОД УДАЛЕНИЯ

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

def fillComboboxDcctoriielf

ллллллллллллллллллллллллллллллл '

sel~., ope n_doc to r_d b ()■ return self,doctors

РИСУНОК 10 - МЕТОД КОМБО БОКСА

Полный код модели будет показан в приложении А.

Далее рассмотрим вид раздела посещений. В нём нужно объявить какая кнопка к какому методу относится, далее нужно прописать эти методы, ссылаясь на тот код, который был разобран в модели раздела посещений. Код с присвоением команд и кнопок будет выглядеть в соответствии с рисунком 11.

(self . ui, Model):

--^ -WWWW^ i1

.ui = ui .model = Model f .model.add Listener(sel~.update)

sel' .ui bAddVisit.clicked.connect(sel~.add)

sel' .ui bNextVisit.clicked.connect(sel~.next)

sel' .ui bPrevVisit.clicked.connect(sel~.prev)

sel' .ui bDeleteVisit.clicked.connect(sel~.delete)

sel' .ui bUpdateVisit. clicked . connect(sel~ .edit)

sel' .ui cbVisitPacient.activated.connect(sel-.selectPacient)

sel' .ui cbVisitDoctor.activated.connect(self.selectDoctor)

self .ui cbVisitBolezn.activated.connect(self.selectBolezn)

def

sel sel sel

РИСУНОК 11 - ПРИСВОЕНИЕ КНОПОК И МЕТОДОВ

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

def . (self):

super(MyUlindoWj self), ()

sel-.ui = Ui_MainUindow() sel~.ui.setupUi(self)

sel"„Doctor = DoctorDB() sel-.Pacient = PacientDB()

vWv4WvWvV » *

sel-.Bolezn = BoleznDBf) sel~„Special = SpecialDB() sel"..Visit = VisitDB()

sel~.DoctorView = DoctorView(self.ui, sel~.Doctor) sel~.PacientView = PacientViewfsel".ui. self.Pacient)

s/VWWvVWW 1 *

sel~.BleznView = BoleznView(sel~.ui„ self.Bolezn) sel~.,SpecialView = SpecialView(sel~.ui, self .Special) sel~„VisitView = VisitView(self.ui, self.Visit)

self .ui. tablilidget .blockSignals( =alse)

self.ui.tablilidget.currentChanged.connect(self.refresh)

РИСУНОК 12 - ЗАПУСК ПРИЛОЖЕНИЯ

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

РИСУНОК 13 - ОКНО ПРИЛОЖЕНИЯ

3 ТЕСТИРОВАНИЕ ПРОГРАММНЫХ МОДУЛЕЙ

Для тестирования программы будет использоваться unit тестирование. Возьмём опять же для примера тестирование раздела посещений пациента.

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

Проверим смогут ли принимать и получать данные программа, для этого пропишем код для принятия и получения данных, в соответствии с рисунком 14.

def testGetPacient(self):

test value = ;acient' —

received_value = self.visit.pacient

sel~ ,,assertEqual(test_valueJ. received_value)

def testSetPacient(self):

test value = 'new cade it'

— VvvV'.-Vv\VvW

received value = 'new pacient'

--Vv'vVVAVvVvV

iНе можете найти то, что вам нужно? Попробуйте сервис подбора литературы.

sel~„visit.pacient = test value

VVWWWWWi —

sel~ ,,assertEqual(test_valueJ. received_value)

РИСУНОК 14 - UNIT TEST

Создадим тесты для всех переменных в данном разделе, это ИД, доктор и болезнь, тест для пациента уже имеется.

Если всё было составлено правильно, то в результате при запуске получаем положительный результат в соответствии с рисунком 15.

Ran S tests in 0.0&4s OK

РИСУНОК 15 - РЕЗУЛЬТАТ ТЕСТИРОВАНИЯ

Так же были произведены тесты методов. Брался метод добавления и удаления данных. Код выглядит в соответствии с рисунком 16.

def testAddVisit(self):

self.visit.add("nai4MeHr"j "Доктор"., "Болезнь") pacient = "Пациент''

MWAWAV.

doctor = "Доктор" bolezn = "Болезнь1' id = len(sel~.visit.db)

sel-nassertEqualfpacient, self.visit.db[id].pacient) sel~ ,,assertEqual(doctor, sel~ .visit .db[id] . doctor) sel~„assertEqualfbolezn, sel~.visit.db[id].bolezn) sel~„visit.delete(id)

def testDeleteVisit(self):

idVisit = list(sel-.visit.db.keys()}[-l]

ЛЛММЛЛМА^ I ' ' ' I- -I

self.visit.add('Пациент', 'Доктор'., "Болезнь") idDelVisit = list(self.visit.db.keysf))[-l]

ЛЛЛЛЛЛЛЛЛЛЛЛЛЛЛЛ/v J ^ f f L J

sel-„visit.delete(idDelVisit)

sel~„assertEqualfidVisit, list(sel~.visit.db.keys())[-l]) sel~„visit.delete(idVisit)

РИСУНОК 16 - ТЕСТИРОВАНИЕ МЕТОДОВ

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

i Надоели баннеры? Вы всегда можете отключить рекламу.