Диплом: Автоматизация учета предоставленных услуг в комплексном центре социального обслуживания населения и анализа данных на примере СПБ ГБУСОН "КЦСОН Адмиралтейского района Санкт-Петербурга"

Внимание! Если размещение файла нарушает Ваши авторские права, то обязательно сообщите нам
81
#############################
# init members
# ---------------------------
self.db: QSqlDatabase = None
self.notifies = []
#############################
# main models storage
# ---------------------------
self.models = {}
# self.init_main_model()
#############################
# some vars
# ---------------------------
self.si = self.servIns(self)
class servIns(QObject):
"""data and functions related to tab insert
into main """
def __init__(self, parent):
"""Constructor for servIns"""
super().__init__(parent)
self.dbeg = None
self.dend = None
self.model_dep_has_main_by_day = None
self.model_dep_has_main_by_day_by_worker = None
self.model_dep_has_main_by_day_by_you = None
self.model_dep_has_main_by_day_by_serv = None
@staticmethod
def insert_main_table(*arg):
"""insert into main (contracts_id,
dep_id, ufio_id, serv_id,
vdate, uslnum, worker_id, note)"""
qry = QSqlQuery()
qry.prepare("""insert into main (contracts_id,
82
dep_id, ufio_id, serv_id,
vdate, uslnum, worker_id, note)
VALUES(?, ?, ?, ?, ?, ?, ?, ?)""")
for val in arg:
qry.addBindValue(val)
ret = qry.exec_()
rid=TsonData.line_query("SELECT LAST_INSERT_ID()")
return (ret, rid, qry.lastError().text().strip())
@staticmethod
def line_query(qry_str, val=0):
qry = QSqlQuery()
qry.exec_(qry_str)
qry.next()
return qry.value(val)
def init_main_model(self):
#############################
# create model
# ---------------------------
sqlTable = "servOFdep"
self.addModel(sqlTable)
def createDBConnection(self):
db = QSqlDatabase.addDatabase('QODBC3')
self.db = db
debug(QSqlDatabase.drivers())
user = self.user
if not self.server:
self.server = "127.0.0.1"
if not self.port:
self.port = "3306"
bdstr = "Driver={MySQL ODBC 8.0 Unicode Driver};" \
"SERVER=%s;DATABASE=kcson;UID=%s;PORT=%s" %
(self.server, user, self.port)
db.setDatabaseName(bdstr)
83
debug(bdstr)
db.setUserName(user)
info(user)
db.setPassword(self.password)
res = db.open()
debug(res)
self.dep = self.line_query("select GET_DEP(GET_wID())
as res", 0)
self.createUnAssignedModels()
return res
def createUnAssignedModels(self):
self.addModel("serv")
self.addModel("dep")
self.addModel("ufio")
self.addModel("serv")
self.addModel("serv_activ")
def closeDBConnection(self):
if self.db:
self.db.close()
self.db = None
def getNotifies(self) -> [str, ]:
"""
"""
try:
if self.db:
qry = QSqlQuery()
qry.exec_("SELECT msg from notifies
WHERE archive=0")
index = qry.record().indexOf('msg')
while qry.next():
yield qry.value(index)
else:
return None
84
except:
return None
def addModel(self, modelName: str = None,
sql: str = None, sqlTable: str = None,
where: str = None) -> QSqlTableModel:
""" Create @model from @sql
Args:
self, modelName=None, sql=None,
sqlTable=None, where=None
Returns:
model or False
"""
if not (sql or sqlTable):
sqlTable = modelName
if not sql:
if sqlTable not in self.db.tables(QSql.AllTables):
return False
if not modelName: modelName = sqlTable
if not modelName: return False
debug("addModel %s to %s", modelName, sqlTable)
#############################
# create model
# ---------------------------
model = tsSqlTableModel(None, self.db)
try:
if sqlTable:
model.setTable(sqlTable)
if where:
model.setFilter(where)
elif sql:
qry = QSqlQuery()
qry.exec_(sql)
qry.next()
85
model.qry_text = sql
model.setQuery(qry)
model.setEditStrategy(
QSqlTableModel.OnManualSubmit)
model.select()
except:
warning("addModel bad sql %s",
(modelName, sql, sqlTable))
return False
#############################
# replace sql column names
# ---------------------------
for i in range(0, model.columnCount()):
label = model.headerData(i, Qt.Horizontal)
if label in self._sql_column_replace.keys():
label = self._sql_column_replace[label]
model.setHeaderData(i, Qt.Horizontal, label)
#############################
# add model to dict
# ---------------------------
self.models[modelName] = model
return model
def convColName(self, colName: str) -> str:
"""
Args:
original SQL column Name
Returns:
new column Name
"""
try:
if self._sql_column_replace[colName]:
return self._sql_column_replace[colName]
except:
return colName
86
def setFilterCol(self, table: QTableView,
colName, model=None):
"""Prepare filter model if needed
and set column for filtering"""
if not model:
model = table.model()
if isinstance(model, tsSqlTableModel):
newmdl = QSortFilterProxyModel()
newmdl.setSourceModel(model)
table.setModel(newmdl)
model = newmdl
smdl: tsSqlTableModel = model.sourceModel()
while not isinstance(smdl, tsSqlTableModel):
smdl = smdl.sourceModel()
col = smdl.tsFieldNames.index(colName)
model.setFilterKeyColumn(col)
return model
def saveConfig(self):
"""Save config file
"""
debug("saveConfig")
config = self.config
config['DEFAULT']['lastuser'] = self.user
# config['DEFAULT']['lastdep']
config['DEFAULT']['dep'] = str(self.dep)
conf_path = os.path.join(home_dir, "3uson.conf")
try:
with open(conf_path, 'w',
encoding='utf-8') as conf_file:
config.write(conf_file)
except:
warning("config not saved")
def get_contract(self, ufio, vdate, dep=None):
if not dep:
87
dep = self.dep
qry = QSqlQuery()
qry.prepare("select GET_CONTR (?, ?, ?) as contr")
qry.addBindValue(ufio)
qry.addBindValue(vdate)
qry.addBindValue(dep)
ret = qry.exec_()
if ret:
qry.next()
return qry.value(0)
else:
return -1
2.4. Контрольный пример реализации проекта и его описание
Работа В АИС ТриУСОН начинается с процесса авторизации (см.
рисунок 18).
Рисунок 18 — Диалоговое окно авторизации после неправильно набранного
пароля
Администратор или специалист организационно-методического отделения
имеют права выдавать пользователям пароли, для этого среди вкладок
«Администрирование» есть вкладка «Выдача пароля» (см. рисунок 19).
88
Рисунок 19 — Вкладка назначения логина и пароля работнику организации
На вкладке «Администрирование» собраны вкладки необходимые для
заполнения различных справочников АИС ТриУСОН, например вкладка
«Перечень РИПСО» приведенная на рисунке 20, в левой таблице редактируется
список РИПСО, а в правой таблице отображается список услуг положенных по
данной программе. Поскольку рисунок 20 сделан в процессе редактирования
данных, на нем можно увидеть, что все остальные вкладки в окне программы
заблокированы — чтобы разблокировать их необходимо либо сохранить
сделанные изменения, либо отказаться от изменений.
Группа вкладок «Список обслуживаемых»(см. рисунок 21) содержит не
только список людей состоящих на обслуживании в отделении, но и несколько
списков помогающих решать задачи оперативного контроля деятельности
отделения. Двойной щелчок по первому столбцу записи открывает карточку
получателя СУ.
89
Рисунок 20 — Вкладка редактирования РИПСО и услуг положенных по
РИПСО
Рисунок 21 — Вкладка список обслуживаемых на отделении
90
Группа вкладок «Карточка клиента» (см. рисунок 22) содержит вкладки с
информацией о клиенте, договоре, дополнительных соглашениях, категориях,
положенных услугах и отчеты о полученных услугах.
Рисунок 22 — Вкладка карточка клиента
Группа вкладок «Ввод услуг» учитывает специфику работы различных
отделений и позволяет вводить единичные услуги (см. рисунок 24), услуги по
дням месяца (часто повторяющиеся услуги, см. рисунок 25), а также групповые
услуги (для клубов и кружков, см. рисунок 26). Также она содержит таблицы
позволяющие проводить оперативный контроль ввода услуг и при
необходимости сразу же исправлять ошибки. Поле осталось отображает
количество оставшихся услуг из положенного получателю СУ набора услуг,
либо причину по которой нельзя ввести услугу. Если пользователь несмотря на
предупреждение все же нажимает «ввод услуги» — отображается диалоговое
окно ошибки — рисунок 23.

Смотрите также:

"Автоматизация обработки заявок ООО "Проектно-Строительная Компания"
"Автоматизация процесса аттестации персонала для ООО "Нэт Бай Нэт Холдинг"
"Анализ интернет-активности конкурентов ( на примере конкурентов "Газпром нефть")
"Бухгалтерский учёт и аудит расчётов с подотчётними лицами в организации на примере ООО "ЛОЦ 10""
«Психологическое сопровождение персонала в организации на примере ООО «Крокус»
Cовершенствование деловой оценки персонала в организации (на примере ООО "Даймонд кейтеринг развитие")
IPO - инструмент финансирования деятельности организации. На примере ПАО «Нефтяная компания «Лукойл»
PR как средство продвижения организации (на примере ПАО "Тамбовский завод "Комсомолец им. Н.С. Артемова")
PR-коммуникации в сфере общественного питания (на примере кафе-кондитерской «Cream Cheese»)
SMM как средство повышения эффективности работы учреждений социокультурной сферы (на примере Малого театра)