def createRowsCols(self, table, chkDenouement, dict_denouement_mkb): ''' :param table: :param chkDenouement: bool :param dict_denouement_mkb: MKBs :return: ''' lst_frth_row = [u'1', u'2', u'3', u'4', u'5', u'6', u'7', u'8', u'9', u'10', u'11', u'12'] lst_count = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21] dict_mkb = OrderedDict() dict_mkb['некоторые инфекционные и паразитарные болезни'] = 'A00 - B99' dict_mkb['новообразования'] = 'C00 - D48' dict_mkb['болезни крови, кроветворных органов и отдельные нарушения, вовлекающие иммунный механизм'] = 'D50 - D89' dict_mkb['болезни эндокринной системы, расстройства питания и нарушения обмена веществ'] = 'E00 - E90' dict_mkb['психические расстройства и расстройства поведения'] = 'F00 - F99' dict_mkb['болезни нервной системы'] = 'G00 - G99' dict_mkb['болезни глаза и его придаточного аппарата'] = 'H00 - H59' dict_mkb['болезни уха и сосцевидного отростка'] = 'H60 - H95' dict_mkb['болезни системы кровообращения'] = 'I00 - I99' dict_mkb['болезни органов дыхания'] = 'J00 - J99' dict_mkb['болезни органов пищеварения'] = 'K00 - K93' dict_mkb['болезни кожи и подкожной клетчатки'] = 'L00 - L98' dict_mkb['болезни костно-мышечной системы и соединительной ткани'] = 'M00 - M99' dict_mkb['болезни мочеполовой системы'] = 'N00 - N99' dict_mkb['беременность, роды и послеродовой период'] = 'O00 - O99' dict_mkb['отдельные состояния, возникающие в перинатальном периоде'] = 'P00 - P96' dict_mkb['врожденные аномалии, пороки развития, деформации и хромосомные нарушения'] = 'Q00 - Q99' dict_mkb['симптомы, признаки и отклонения от нормы, выявленные при клинических и лабораторных исследованиях, ' \ 'не классифицированные в других рубриках'] = 'R00 - R99' dict_mkb['травмы, отравления и некоторые другие последствия воздействия внешних причин'] = 'S00 - T98' dict_mkb['Кроме того: факторы, влияющие на состояние здоровья и обращения в учреждения здравоохранения'] = 'Z00 - Z99' #OrderedDict((word, True) for word in dict_mkb) i = table.addRow() for j in range(0, 12): table.setText(i, lst_count[j], lst_frth_row[j]) i = table.addRow() table.setText(i, 0, "Всего, в том числе:") table.setText(i, 1, "1") if chkDenouement is False: table.setText(i, 2, "A00-T98") for j in range(0, len(dict_mkb)): i = table.addRow() table.setText(i, 0, dict_mkb.keys()[j]) table.setText(i, 1, lst_count[j+2]) table.setText(i, 2, dict_mkb.values()[j]) elif chkDenouement is True: table.setText(i, 2, "") for j in range(0, len(dict_denouement_mkb)): i = table.addRow() table.setText(i, 0, dict_denouement_mkb.keys()[j]) table.setText(i, 1, j+2) table.setText(i, 2, dict_denouement_mkb.values()[j])
class CConnectionDialog(QtGui.QDialog, Ui_connectionDialog): iniFileName = 'connections.ini' def __init__(self, parent): QtGui.QDialog.__init__(self, parent) self.setupUi(self) self.edtConnectionName.completer().setCompletionMode( QtGui.QCompleter.UnfilteredPopupCompletion) self.connect(self, QtCore.SIGNAL('accepted()'), self.saveConnectionInfo) self.connectionInfo = OrderedDict() self.loadConnectionInfo() def setDriverName(self, val): pass def driverName(self): return 'mysql' def setServerName(self, val): self.edtServerName.setText(val) def setConnectionName(self, name): defaultName = u'Основной' connectionIndex = self.edtConnectionName.findText(name) if connectionIndex < 0: connectionIndex = self.edtConnectionName.findText(defaultName) if connectionIndex < 0: connectionIndex = self.edtConnectionName.findText( self.serverName()) if connectionIndex < 0: self.edtConnectionName.setEditText(defaultName) else: self.edtConnectionName.setCurrentIndex(connectionIndex) def connectionName(self): return self.edtConnectionName.currentText() def serverName(self): return str(self.edtServerName.text()) def setServerPort(self, val): self.edtServerPort.setValue(val) def serverPort(self): return self.edtServerPort.value() def setDatabsaseName(self, val): self.edtDatabaseName.setText(val) def setLoggerDbName(self, val): self.edtLoggerDbName.setText(val) def databaseName(self): return self.edtDatabaseName.text() def loggerDbName(self): if self.edtLoggerDbName.text(): return self.edtLoggerDbName.text() else: self.edtLoggerDbName.setText(u"logger") return self.edtLoggerDbName.text() def setCompressData(self, val): self.chkCompressData.setChecked(bool(val)) def compressData(self): return self.chkCompressData.isChecked() def setUserName(self, val): self.edtUserName.setText(val) def userName(self): return self.edtUserName.text() def setPassword(self, val): self.edtPassword.setText(val) def password(self): return str(self.edtPassword.text()) def setNewAuthorizationScheme(self, val): checkedValue = bool(val) self.chkAutScheme.setChecked(checkedValue) self.on_chkAutScheme_clicked(checkedValue) def newAuthorizationScheme(self): return self.chkAutScheme.isChecked() def connectionOrgId(self): connectionInfo = self.connectionInfo.get( self.edtConnectionName.currentText(), None) return connectionInfo[3] if connectionInfo else 0 def connectionLogin(self): connectionInfo = self.connectionInfo.get( self.edtConnectionName.currentText(), None) return connectionInfo[4] if connectionInfo else u'' def connectionOrgStructureId(self): connectionInfo = self.connectionInfo.get( self.edtConnectionName.currentText(), None) return connectionInfo[5] if connectionInfo else 0 @QtCore.pyqtSlot(bool) def saveConnectionInfo(self): settings = CPreferences.getSettings(self.iniFileName) settings.beginGroup(self.edtConnectionName.currentText()) settings.setValue('host', toVariant(self.serverName())) settings.setValue('port', toVariant(self.serverPort())) settings.setValue('database', toVariant(self.databaseName())) settings.setValue('loggerdb', toVariant(self.loggerDbName())) # settings.setValue('orgId', toVariant(QtGui.qApp.currentOrgId())) settings.endGroup() settings.sync() def loadConnectionInfo(self): self.connectionInfo.clear() settings = CPreferences.getSettings(self.iniFileName) for connectionName in settings.childGroups(): settings.beginGroup(connectionName) self.connectionInfo[connectionName] = ( forceString(settings.value('host', connectionName)), forceInt(settings.value('port', 0)), forceString(settings.value('database', u's11')), forceRef(settings.value('orgId', None)), forceString(settings.value('login', u'')), forceRef(settings.value('orgStructureId', None)), forceString(settings.value('loggerdb', u'logger'))) settings.endGroup() self.edtConnectionName.addItems(self.connectionInfo.keys()) @QtCore.pyqtSlot(bool) def on_chkAutScheme_clicked(self, checked): self.groupBox.setEnabled(not checked) @QtCore.pyqtSlot(int) def on_edtConnectionName_currentIndexChanged(self, index): currentText = self.edtConnectionName.currentText() if currentText in self.connectionInfo.keys(): host, port, database = self.connectionInfo[currentText][:3] loggerdb = self.connectionInfo[currentText][6] self.setServerName(host) self.setServerPort(port) self.setDatabsaseName(database) self.setLoggerDbName(loggerdb) @QtCore.pyqtSlot() def on_btnDelConnectionInfo_clicked(self): settings = CPreferences.getSettings(self.iniFileName) currentText = self.edtConnectionName.currentText() if currentText in settings.childGroups(): settings.remove(currentText) settings.sync() self.connectionInfo.pop(currentText, None) self.edtConnectionName.clear() self.edtConnectionName.addItems(self.connectionInfo.keys()) self.edtConnectionName.setCurrentIndex(0)
def build(self, params): doc = QtGui.QTextDocument() cursor = QtGui.QTextCursor(doc) cursor.setCharFormat(CReportBase.ReportTitle) cursor.insertText(self.title()) cursor.insertBlock() self._title = u"3.1. Дневные стационары для взрослых" cursor.insertText(self.title()) cursor.insertBlock() self.dumpParams(cursor, params) cursor.insertBlock() cursor.insertText("(3000)") cursor.insertBlock() tableColumns = [ ('24%', [u'Наименование классов МКБ-10', u'', u''], CReportBase.AlignLeft), ('3%', [u'№ строки', u'', u''], CReportBase.AlignLeft), ('10%', [u'Код по МКБ-10', u'', u''], CReportBase.AlignLeft), ('7%', [u'Дневные стационары медицинских организаций, оказывающих медицинскую помощь', u'в стационарных условиях', u'Выписано пациентов'], CReportBase.AlignLeft), ('7%', [u'', u'', u'Проведено пациенто - дней'], CReportBase.AlignLeft), ('7%', [u'', u'', u'Умерло'], CReportBase.AlignLeft), ('7%', [u'', u'в амбулаторных условиях', u'Выписано пациентов'], CReportBase.AlignLeft), ('7%', [u'', u'', u'Проведено пациенто - дней'], CReportBase.AlignLeft), ('7%', [u'', u'', u'Умерло'], CReportBase.AlignLeft), ('7%', [u'', u'на дому', u'Выписано пациентов'], CReportBase.AlignLeft), ('7%', [u'', u'', u'Проведено пациенто - дней'], CReportBase.AlignLeft), ('7%', [u'', u'', u'Умерло'], CReportBase.AlignLeft) ] table = createTable(cursor, tableColumns) RegularBedId = getVal(params, 'RegularBedId', None) chkDenouement = getVal(params, 'chkDenouement', False) db = QtGui.qApp.db orgStructureId = getVal(params, 'orgStructureId', None) tblOrgstructure = db.table('OrgStructure') Orgstructure = db.getRecordList(tblOrgstructure, cols='id, name, parent_id') lst_id = [] if orgStructureId is None: ''' load everything from orgstructure, if no organisation is chosen ''' for rec in Orgstructure: lst_id.append(int(forceString(rec.value("id")))) else: ''' list from the organisation_tree that should be included ''' lst_id.append(int(orgStructureId)) for id in lst_id: for rec in Orgstructure: if int(id) == int(forceString(rec.value("parent_id"))) and int( forceString(rec.value("id"))) not in lst_id: lst_id.append(int(forceString(rec.value("id")))) ii = 0 lst_bedProfile = [ "(oh.isPermanent = 1 OR oh.isPermanent = 0)", "oh.isPermanent = 1", "oh.isPermanent = 0" ] lst_MKB = ["'A00%%' AND 'B99%%' OR d.MKB LIKE 'B99%%'", "'C00%%' AND 'D48%%' OR d.MKB LIKE 'D48%%'", "'D50%%' AND 'D89%%' OR d.MKB LIKE 'D89%%'", "'E00%%' AND 'E90%%' OR d.MKB LIKE 'E90%%'", "'F00%%' AND 'F99%%' OR d.MKB LIKE 'F99%%'", "'G00%%' AND 'G99%%' OR d.MKB LIKE 'G99%%'", "'H00%%' AND 'H59%%' OR d.MKB LIKE 'H59%%'", "'H60%%' AND 'H95%%' OR d.MKB LIKE 'H95%%'", "'I00%%' AND 'I99%%' OR d.MKB LIKE 'I99%%'", "'J00%%' AND 'J99%%' OR d.MKB LIKE 'J99%%'", "'K00%%' AND 'K93%%' OR d.MKB LIKE 'K93%%'", "'L00%%' AND 'L98%%' OR d.MKB LIKE 'L98%%'", "'M00%%' AND 'M99%%' OR d.MKB LIKE 'M99%%'", "'N00%%' AND 'N99%%' OR d.MKB LIKE 'N99%%'", "'O00%%' AND 'O99%%' OR d.MKB LIKE 'O99%%'", "'P00%%' AND 'P96%%' OR d.MKB LIKE 'P96%%'", "'Q00%%' AND 'Q99%%' OR d.MKB LIKE 'Q99%%'", "'R00%%' AND 'R99%%' OR d.MKB LIKE 'R99%%'", "'S00%%' AND 'T98%%' OR d.MKB LIKE 'T98%%'", "'Z00%%' AND 'Z99%%' OR d.MKB LIKE 'Z99%%'"] bedProfile = lst_bedProfile[0] if RegularBedId == 0: bedProfile = lst_bedProfile[0] elif RegularBedId == 1: bedProfile = lst_bedProfile[1] else: bedProfile = lst_bedProfile[2] dict_denouement_mkb = OrderedDict() tblMKB = db.table('MKB') if chkDenouement is True: for row in range(0, len(lst_MKB)): for org_id in range(0, len(lst_id)): MKB_query = u"d.MKB BETWEEN %s" % lst_MKB[row] query_SDP = selectDataMKB(params, lst_id[org_id], bedProfile,8, MKB_query) query_DS = selectDataMKB(params, lst_id[org_id], bedProfile, 7, MKB_query) self.setQueryText(forceString(query_SDP.lastQuery())) self.setQueryText(forceString(query_DS.lastQuery())) while query_SDP.next(): record = query_SDP.record() mkb = forceString(record.value('MKB')) mkb_name = db.getRecordEx(table=tblMKB, cols='DiagName', where=tblMKB['DiagID'].eq(mkb)) field = mkb_name.field(0) dict_denouement_mkb[field.value().toString()] = forceString(record.value('MKB')) while query_DS.next(): record = query_DS.record() mkb = forceString(record.value('MKB')) mkb_name = db.getRecordEx(table=tblMKB, cols='DiagName', where=tblMKB['DiagID'].eq(mkb)) field = mkb_name.field(0) dict_denouement_mkb[field.value().toString()] = forceString(record.value('MKB')) elif chkDenouement is False: for row in range(0, len(lst_MKB)): dict_denouement_mkb[lst_MKB[row]] = "" self.createRowsCols(table, chkDenouement, dict_denouement_mkb) sumPac_col4 = 0 sumDays_col5 = 0 sumOth_col6 = 0 sumPac_col7 = 0 sumDays_col8 = 0 sumOth_col9 = 0 ''' We are looping through list of MKB ranges, checking in each orgstructure if they have that bed summing the values for each bed ''' for row in range(0, len(dict_denouement_mkb)): sum_col5 = 0 sum_col8 = 0 days_col5 = 0 days_col8 = 0 sumcol4 = 0 sumcol6 = 0 sumcol7 = 0 sumcol9 = 0 for org_id in range(0, len(lst_id)): if chkDenouement is False: str_mkb = str(dict_denouement_mkb.keys()[row])[-6:-1] # F99%% MKB_query = u"(d.MKB BETWEEN %s OR d.MKB LIKE '%s')" % (dict_denouement_mkb.keys()[row], str_mkb) ''' MKB_query (d.MKB BETWEEN 'E00%' AND 'E90%' OR d.MKB='E00') ''' #MKB_query = u"d.MKB BETWEEN %s" % (dict_denouement_mkb.keys()[row]) elif chkDenouement is True: MKB_query = u"d.MKB = '%s'" % dict_denouement_mkb.values()[row] query_col5 = selectData_PacientDays(params, lst_id[org_id],bedProfile, 8, MKB_query) query_col8 = selectData_PacientDays(params, lst_id[org_id], bedProfile, 7, MKB_query) query = selectData(params, lst_id[org_id], bedProfile, MKB_query) self.setQueryText(forceString(query.lastQuery())) self.setQueryText(forceString(query_col5.lastQuery())) self.setQueryText(forceString(query_col8.lastQuery())) ''' sum of pacients for every organisation (that's why in this for) ''' while query_col5.next(): record_col5 = query_col5.record() ''' get the number of days having in mind the length of the working week ''' days_col5 = getEventLengthDays( forceDate(record_col5.value('e_set')), forceDate(record_col5.value('e_exec')), countRedDays=False, eventTypeId=forceString(record_col5.value('et_id')), isDayStationary=True) sum_col5 += int(days_col5) ''' Всего, в том числе ''' while query_col8.next(): record_col8 = query_col8.record() days_col8 = getEventLengthDays( forceDate(record_col8.value('e_set')), forceDate(record_col8.value('e_exec')), countRedDays=False, eventTypeId=forceString(record_col8.value('et_id')), isDayStationary=True) sum_col8 += int(days_col8) while query.next(): record = query.record() sumcol4 += int(forceString(record.value('discharge_Patients_SDP'))) sumcol7 += int(forceString(record.value('discharge_Patients_DS'))) sumcol6 += int(forceString(record.value('dead_SDP'))) sumcol9 += int(forceString(record.value('dead_DS'))) sumDays_col5 += sum_col5 sumDays_col8 += sum_col8 table.setText(ii + 5, 4, sum_col5) table.setText(ii + 5, 7, sum_col8) sumPac_col4 += sumcol4 sumPac_col7 += sumcol7 sumOth_col6 += sumcol6 sumOth_col9 += sumcol9 table.setText(ii + 5, 3, sumcol4) table.setText(ii + 5, 5, sumcol6) table.setText(ii + 5, 6, sumcol7) table.setText(ii + 5, 8, sumcol9) ii = ii + 1 ''' sum of all the columns minus the last one (Z) ''' if chkDenouement is False: sumPac_col4 -= int(sumcol4) sumDays_col5 -= int(days_col5) sumOth_col6 -= int(sumcol6) sumPac_col7 -= int(sumcol7) sumDays_col8 -= int(days_col8) sumOth_col9 -= int(sumcol9) table.setText(4, 3, sumPac_col4) table.setText(4, 4, sumDays_col5) table.setText(4, 5, sumOth_col6) table.setText(4, 6, sumPac_col7) table.setText(4, 7, sumDays_col8) table.setText(4, 8, sumOth_col9) self.merge_cells(table) return doc
def build(self, params): noFinanceDetail = params.get('noFinanceDetail', False) db = QtGui.qApp.db doc = QtGui.QTextDocument() cursor = QtGui.QTextCursor(doc) cursor.setCharFormat(CReportBase.ReportTitle) cursor.insertText(self.title()) cursor.insertBlock() self.dumpParams(cursor, params) cursor.insertBlock() tableColumns = [ ('5%', [u'', u'', u'', u'', u''], CReportBase.AlignLeft), ('10%', [u'', u'', u'', u'', u''], CReportBase.AlignLeft), ('10%', [ u'Движение больных за истекшие сутки', u'Состояло больных на начало текущих суток', u'', u'', u'1' ], CReportBase.AlignLeft), ('10%', [u'', u'Поступило больных', u'Всего', u'', u'2'], CReportBase.AlignLeft), ('10%', [u'', u'', u'из них', u'пенсионеров', u'3'], CReportBase.AlignLeft), ('10%', [u'', u'', u'из иногородних', u'всего', u'4'], CReportBase.AlignLeft), ('10%', [u'', u'', u'', u'жителей села', u'5'], CReportBase.AlignLeft), ('10%', [ u'', u'Переведено больных внутри больницы', u'из других отделений', u'', u'6' ], CReportBase.AlignLeft), ('10%', [u'', u'', u'в другие отделения', u'', u'7'], CReportBase.AlignLeft), ('5%', [u'', u'Выписано больных', u'', u'', u'8'], CReportBase.AlignLeft), ('5%', [u'', u'Умерло', u'', u'', u'9'], CReportBase.AlignLeft), ('10%', [u'Состоит больных на начало текущего дня', u'', u'', u'', u'10'], CReportBase.AlignLeft) ] table = createTable(cursor, tableColumns) table.mergeCells(0, 0, 5, 1) table.mergeCells(0, 1, 5, 1) table.mergeCells(0, 2, 1, 9) table.mergeCells(1, 2, 3, 1) table.mergeCells(1, 3, 1, 4) table.mergeCells(2, 3, 2, 1) table.mergeCells(2, 5, 1, 2) table.mergeCells(1, 7, 1, 2) table.mergeCells(2, 7, 2, 1) table.mergeCells(2, 8, 2, 1) table.mergeCells(1, 9, 3, 1) table.mergeCells(1, 10, 3, 1) table.mergeCells(0, 11, 4, 1) (hospET, dayHospET, movingAT, receivedAT, leavedAT, movingCurOSAPT, movingFromOSAPT, movingToOSAPT, receivedCurOSAPT, leavedCurOSAPT, leavedOutcomeAPT, quoteAP, omsFinance, pmuFinance, dmsFinance, omsVmpFinance, omsLtFinance, akiFinance, budgetFinance, reanimationDepId, allReanimationsId) = loadIds() def getFinanceRow(rec): quotaClass = forceInt(rec.value('quotaClass')) if not rec.value( 'quotaClass').isNull() else None financeID = forceInt(rec.value( 'financeID')) if not rec.value('financeId').isNull() else None if quotaClass == 0: return 'vmp' if quotaClass == 1: return 'smp' if quotaClass == 7 or financeID == akiFinance: return 'aki' if financeID == omsFinance: return 'oms' if financeID == pmuFinance: return 'pmu' if financeID == dmsFinance: return 'dms' if financeID == omsVmpFinance and quotaClass == 5: return 'oms_vmp' if financeID == omsLtFinance: return 'oms_lt' if financeID == budgetFinance: return 'budget' QtGui.qApp.restoreOverrideCursor() res = QtGui.QMessageBox().warning( None, u'Не удалось определить тип финансирования', u'Код клиента: %s\nВнешний код: %s\nfinanceId: %s\nquotaClass: %s\n\n' u'Открыть обращение?' % (forceString(rec.value('cid')), forceString(rec.value('externalId')), financeID, quotaClass), QtGui.QMessageBox.Yes | QtGui.QMessageBox.Retry | QtGui.QMessageBox.Cancel) if res == QtGui.QMessageBox.Yes: editEvent(None, forceRef(rec.value('eventId'))) elif res == QtGui.QMessageBox.Retry: CArrivedDepartedPatients(None).exec_() raise ValueError def getEventType(rec): return 'ks' if forceRef(rec.value('eventType')) == hospET else 'ds' def getClientItem(rec): return '%s %s.%s. (%s)' % (forceString(rec.value('lastName')), forceString(rec.value('firstName'))[:1], forceString(rec.value('patrName'))[:1], forceString(rec.value('externalId'))) # strType = '(type = 1 or type = 5)' if params['reanimation'] else 'type = 1' os_ids = params['LPU'] if not params['allLPU'] else \ QtGui.qApp.db.getIdList('OrgStructure', where='(type = 1 or type = 5) AND hasHospitalBeds = 1 AND deleted = 0 AND ' 'EXISTS(SELECT oshb.id ' ' FROM OrgStructure_HospitalBed oshb ' ' WHERE oshb.master_id = OrgStructure.id)', order='code') finances = lambda: { 'vmp': [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], 'smp': [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], 'oms': [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], 'pmu': [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], 'dms': [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], 'oms_vmp': [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], 'oms_lt': [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], 'aki': [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], 'budget': [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], 'total': [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], } types = lambda: { 'ks': finances(), 'ds': finances(), 'total': [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], } names = lambda: {'ks': set(), 'ds': set()} OSdata = OrderedDict((os_id, types()) for os_id in os_ids) OSdata['total'] = types() received = names() leaved_alive = names() leaved_dead = names() moved_to_current = names() # Переведено из других moved_from_current = names() # Переведено в другие startDate = params['begDate'].toTime_t( ) # int(time.mktime(datetime.strptime('2017-04-04 00:00:00', '%Y-%m-%d %H:%M:%S').timetuple())) endDate = params['endDate'].toTime_t( ) # int(time.mktime(datetime.strptime('2017-04-04 23:59:59', '%Y-%m-%d %H:%M:%S').timetuple())) moving_sql = MOVING_QUERY.format(hospET=hospET, dayHospET=dayHospET, movingAT=movingAT, movingCurOSAPT=movingCurOSAPT, quoteAP=quoteAP, movingFromOSAPT=movingFromOSAPT, movingToOSAPT=movingToOSAPT, startDate=startDate, endDate=endDate) queryReanimation_sql = QUERY_REANIMATIONDEPARTMENT.format( hospET=hospET, dayHospET=dayHospET, movingAT=movingAT, quoteAP=quoteAP, startDate=startDate, endDate=endDate, reanimationDepId=reanimationDepId, allReanimationsId=allReanimationsId) transfer_sql = TRANSFER_QUERY.format(hospET=hospET, dayHospET=dayHospET, movingAT=movingAT, movingCurOSAPT=movingCurOSAPT, quoteAP=quoteAP, movingFromOSAPT=movingFromOSAPT, movingToOSAPT=movingToOSAPT, startDate=startDate, endDate=endDate) received_sql = RECEIVED_QUERY.format(hospET=hospET, dayHospET=dayHospET, receivedAT=receivedAT, receivedCurOSAPT=receivedCurOSAPT, movingAT=movingAT, quoteAP=quoteAP, startDate=startDate, endDate=endDate) leaved_sql = LEAVED_QUERY.format(hospET=hospET, dayHospET=dayHospET, leavedAT=leavedAT, leavedCurOSAPT=leavedCurOSAPT, leavedOutcomeAPT=leavedOutcomeAPT, movingAT=movingAT, quoteAP=quoteAP, startDate=startDate, endDate=endDate) self.setQueryText(';\n'.join((moving_sql, received_sql, leaved_sql, transfer_sql, queryReanimation_sql)) + ';') def inc(os, rec, column): financeRow = getFinanceRow(rec) eventType = getEventType(rec) OSdata[os]['total'][column] += 1 OSdata[os][eventType]['total'][column] += 1 OSdata[os][eventType][financeRow][column] += 1 OSdata['total']['total'][column] += 1 OSdata['total'][eventType]['total'][column] += 1 OSdata['total'][eventType][financeRow][column] += 1 try: if params['reanimation']: for rec in db.iterRecordList(stmt=transfer_sql): recBegDate = forceLong(rec.value('begUNIX')) recEndDate = forceLong(rec.value('endUNIX')) recCurrentOS = forceRef(rec.value('currentOS')) if startDate <= recBegDate <= endDate and recCurrentOS in OSdata.keys( ): moved_to_current[getEventType(rec)].add( getClientItem(rec)) inc(recCurrentOS, rec, MOVED_TO_CURRENT) if startDate <= recEndDate <= endDate and recCurrentOS in OSdata.keys( ): moved_from_current[getEventType(rec)].add( getClientItem(rec)) inc(recCurrentOS, rec, MOVED_FROM_CURRENT) for rec in db.iterRecordList(stmt=queryReanimation_sql): recBegDate = forceLong(rec.value('begDate')) recEndDate = forceLong(rec.value('endDate')) recCurrentOS = forceRef(rec.value('currentOS')) endDateIndicator = forceInt(rec.value('endDateIndicator')) # moreThan2H = forceInt(rec.value('moreThan2H')) # if endDateIndicator == moreThan2H: if ( rec.value('endDate').isNull() or recEndDate > recBegDate ) and recBegDate < startDate and recCurrentOS in OSdata.keys(): #startDate <= recBegDate <= endDate inc(recCurrentOS, rec, START_COUNT) if startDate <= recBegDate <= endDate and recCurrentOS in OSdata.keys( ): moved_to_current[getEventType(rec)].add(getClientItem(rec)) inc(recCurrentOS, rec, MOVED_TO_CURRENT) if (startDate <= recEndDate <= endDate) and recCurrentOS in OSdata.keys(): moved_from_current[getEventType(rec)].add( getClientItem(rec)) inc(recCurrentOS, rec, MOVED_FROM_CURRENT) if ( rec.value('endDate').isNull() or recEndDate > endDate ) and recBegDate <= endDate and recCurrentOS in OSdata.keys(): inc(recCurrentOS, rec, END_COUNT) for rec in db.iterRecordList(stmt=moving_sql): recBegDate = forceLong(rec.value('begDate')) recEndDate = forceLong(rec.value('endDate')) recCurrentOS = forceRef(rec.value('currentOS')) recFromOS = forceRef(rec.value('fromOS')) recToOS = forceRef(rec.value('toOS')) if (recBegDate <= startDate and (recEndDate >= startDate or rec.value('endDate').isNull()) and recCurrentOS in OSdata.keys()): inc(recCurrentOS, rec, START_COUNT) if (recBegDate <= endDate and (recEndDate >= endDate or rec.value('endDate').isNull()) and recCurrentOS in OSdata.keys()): inc(recCurrentOS, rec, END_COUNT) # переведены в указанные отделения if (startDate <= recEndDate <= endDate and recCurrentOS is not None and recToOS in OSdata.keys()): moved_to_current[getEventType(rec)].add(getClientItem(rec)) inc(recToOS, rec, MOVED_TO_CURRENT) # переведены из указанных отделений if (startDate <= recBegDate <= endDate and recCurrentOS is not None and recFromOS in OSdata.keys()): moved_from_current[getEventType(rec)].add( getClientItem(rec)) inc(recFromOS, rec, MOVED_FROM_CURRENT) for rec in db.iterRecordList(stmt=received_sql): recIsVillager = forceBool(rec.value('isVillager')) recIsForeigner = forceBool(rec.value('isForeigner')) recIsPensioner = forceBool(rec.value('isPensioner')) recCurrentOS = forceRef(rec.value('currentOS')) recEndDate = forceLong(rec.value('endDate')) if (startDate <= recEndDate <= endDate and recCurrentOS in OSdata.keys()): inc(recCurrentOS, rec, RECEIVED_TOTAL) received[getEventType(rec)].add(getClientItem(rec)) if recIsPensioner: inc(recCurrentOS, rec, RECEIVED_PENSIONER) if recIsForeigner: inc(recCurrentOS, rec, RECEIVED_FOREIGN) if recIsVillager: inc(recCurrentOS, rec, RECEIVED_VILLAGER) for rec in db.iterRecordList(stmt=leaved_sql): recBegDate = forceLong(rec.value('begDate')) recCurrentOS = forceRef(rec.value('currentOS')) recIsDeath = forceString(rec.value('outcome')) == u'умер' if startDate <= recBegDate <= endDate and recCurrentOS in OSdata.keys( ): if recIsDeath: leaved_dead[getEventType(rec)].add(getClientItem(rec)) inc(recCurrentOS, rec, LEAVED_DEAD) else: leaved_alive[getEventType(rec)].add(getClientItem(rec)) inc(recCurrentOS, rec, LEAVED_ALIVE) except ValueError: return None def write_event_type(os_id, is_ks=True): et = 'ks' if is_ks else 'ds' if not noFinanceDetail: row = table.addRowWithContent(u'', u'ВМП', *OSdata[os_id][et]['vmp']) table.addRowWithContent(u'', u'СМП', *OSdata[os_id][et]['smp']) table.addRowWithContent(u'', u'ОМС', *OSdata[os_id][et]['oms']) table.addRowWithContent(u'', u'ПМУ', *OSdata[os_id][et]['pmu']) table.addRowWithContent(u'', u'ДМС', *OSdata[os_id][et]['dms']) table.addRowWithContent(u'', u'ВМП из ОМС', *OSdata[os_id][et]['oms_vmp']) table.addRowWithContent(u'', u'ОМС ЛТ', *OSdata[os_id][et]['oms_lt']) table.addRowWithContent(u'', u'АКИ', *OSdata[os_id][et]['aki']) table.addRowWithContent(u'', u'Донор/Прочее', *OSdata[os_id][et]['budget']) table.addRowWithContent(u'КС' if is_ks else u'ДС', u'Итого', *OSdata[os_id][et]['total'], charFormat=self.boldFormat) if not noFinanceDetail: table.mergeCells(row, 0, 10, 1) for os_id in OSdata.keys(): if os_id == 'total': if len(os_ids) == 1: continue os_code = u'все подразделения' else: os_code = forceString( db.translate('OrgStructure', 'id', os_id, 'code')) row = table.addRowWithContent(os_code) table.mergeCells(row, 0, 1, 12) write_event_type(os_id) write_event_type(os_id, False) row = table.addRowWithContent(u'Итого ' + os_code, u'', *OSdata[os_id]['total'], charFormat=self.boldFormat) table.mergeCells(row, 0, 1, 2) if noFinanceDetail: table.table.removeColumns(1, 1) cursor.movePosition(QtGui.QTextCursor.End) cursor.insertBlock() cursor.insertText( u'\nДежурная медсестра: _____________________________________') cursor.insertBlock() if not params['allLPU']: def insertClientList(lst, row, col): table.setHtml( row, col, u'<ol><li>' + u'</li><li>'.join(lst) + u'</li></ol>') def insertClientsRow(et): table.addRow() insertClientList(received[et], 1, 0) insertClientList(leaved_alive[et], 1, 1) insertClientList(leaved_dead[et], 1, 2) insertClientList(moved_to_current[et], 1, 3) insertClientList(moved_from_current[et], 1, 4) tableColumns = [ ('20%', [u'Поступило:'], CReport.AlignLeft), ('20%', [u'Выписано:'], CReport.AlignLeft), ('20%', [u'Умерло:'], CReport.AlignLeft), ('20%', [u'Переведено из:'], CReport.AlignLeft), ('20%', [u'Переведено в:'], CReport.AlignLeft), ] cursor.insertText(u'\n\nГоспитализация', CReport.ReportSubTitle) textFormat = QtGui.QTextBlockFormat() textFormat.setPageBreakPolicy( QtGui.QTextBlockFormat.PageBreak_AlwaysBefore) cursor.setBlockFormat(textFormat) cursor.insertBlock() textFormat.setPageBreakPolicy( QtGui.QTextBlockFormat.PageBreak_Auto) cursor.setBlockFormat(textFormat) table = createTable(cursor, tableColumns, border=0, cellPadding=0) insertClientsRow('ks') cursor.movePosition(QtGui.QTextCursor.End) cursor.insertBlock() cursor.insertText(u'\n\nДС Госпитализация', CReport.ReportSubTitle) cursor.insertBlock() table = createTable(cursor, tableColumns, border=0, cellPadding=0) table.table.format().setAlignment(QtCore.Qt.AlignTop) insertClientsRow('ds') return doc