ck-ntuh-net/mysite/ck_cron.py
2024-12-11 16:15:42 +08:00

380 lines
13 KiB
Python
Executable file
Raw Permalink Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/usr/bin/python
# coding=utf-8
from __future__ import unicode_literals
import datetime
import os
import re
import subprocess
import time
import django
os.environ['DJANGO_SETTINGS_MODULE'] = 'mysite.settings'
# os.environ.setdefault("DJANGO_SETTINGS_MODULE", "mysite.settings")
django.setup()
from django.db.models import Count
from import_export import resources
from import_export.fields import Field
# import rotate_backups
# from mechanize import Browser
# br = Browser()
# br.set_handle_robots(False)
from ck.models import *
from ck.common import SortNHI, UpdateNHICase, UpdateNHICase2, AddPatient, QueryMS, GetCaseForCyberKnifeList
# from ntuhgov import intra
import ntuhgov.portal_selenium as portal
from ntuhgov.portal_selenium import QueryCase, QueryCaseByPass
QUEUE_DIR='/tmp/queue'
QUEUE_DIR='/mnt/pve/Public/queue'
# MAX_PAT = 200
def PortalRefresh():
patients = Patient.objects.filter(dead__isnull=True).order_by('timestamp')
MAX_PAT = int(patients.count() / 30)
# patients = Patient.objects.all()
# patients = patients.filter(medical_records='5619422')
SESSION = portal.Login()
n_pat = 0
for patient in patients:
if n_pat>MAX_PAT:
break
if patient.dead:
continue
print(n_pat,'/',MAX_PAT)
n_pat += 1
# Update ElectronicMedicalReport
patient.save() # update timestamp
print(patient.id, patient.medical_records, patient)
excluded = patient.electronicmedicalreport_set.all().values_list('report_key', flat=True)
# print(excluded)
# reports = portal.ElectronicMedicalReportViewer(patient.medical_records, startswith='T0', excluded=excluded)
reports = portal.ElectronicMedicalReportViewer(patient.medical_records, excluded=excluded)
# print(len(reports))
for report in reports:
# 沒報告?
if report['檢查日期'] == '*' or report['報告日期'] == '*':
continue
r = ElectronicMedicalReport(patient=patient)
r.report_key = report['ReportKey']
r.report_class = report['報告類別']
r.check_date = datetime.datetime.strptime(report['檢查日期'], "%Y/%m/%d")
r.report_date = datetime.datetime.strptime(report['報告日期'], "%Y/%m/%d")
r.report_code = report['ReportCode']
r.report = report['html']
r.save()
if patient.id_cards.find(u' ') != -1:
# print '"%s"' % patient.id_cards
patient.id_cards = patient.id_cards.replace(u' ','')
# print '"%s"' % patient.id_cards
patient.save()
q = PACSImage.objects.filter(patient=patient)
#Update PACSImageShowList
# print(patient.id_cards)
PACSList = portal.PACSImageShowList(patient.id_cards, SESSION)
for pacs in PACSList:
# print(pacs)
qq = q.filter(RequestSheetNo=pacs['RequestSheetNo'])
if len(qq) == 0:
# print pacs
p = PACSImage(patient=patient)
p.PatChartNo = pacs['PatChartNo']
p.RequestSheetNo = pacs['RequestSheetNo']
try:
p.ExamDate = datetime.datetime.strptime(pacs['ExamDate'],'%Y%m%d')
except:
continue
p.LinkOrderName = pacs['LinkOrderName']
p.Modality = pacs['Modality']
p.VerifiedStateString = pacs['VerifiedStateString']
p.Saved = 0 #Not saved
p.save()
# continue #for debug
#Read from old intra system, Dysfunction
# Xray = XrayExam(patient.medical_records)
# for x in Xray:
# qq = q.filter(RequestSheetNo=x['ReferNo'])
# if len(qq) == 0:
# print x
# p = PACSImage(patient=patient)
# p.PatChartNo = x['ChartNo']
# p.RequestSheetNo = x['ReferNo']
# p.ExamDate = datetime.datetime.strptime(x['ExamDate'],'%Y-%m-%d')
# p.LinkOrderName = x['LinkOrderName']
# p.Modality = x['Modality']
# p.VerifiedStateString = x['status']
# p.Saved = 0 #Not saved
# p.save()
#Update MedicalRecord
print(patient.medical_records)
MR = portal.PatientMedicalRecordListQuery(patient.medical_records, SESSION=SESSION)
try:
print(MR['Description'])
print('%d %s %s %s'% (patient.id, patient.medical_records, MR['extra'], MR['dead']))
except:
print('************************************************************')
# exit()
q = MedicalRecord.objects.filter(patient=patient)
for mr in MR['InPat']:
qq = q.filter(InDate=mr['InDate'])
if len(qq)==0 or qq[0].OutDate==None:
# print mr
if len(qq)==0:
m = MedicalRecord(patient=patient)
else:
m = qq[0]
m.Record = '' # 住急門
m.HospName = mr['HospName']
m.DeptName = mr['DeptName']
m.InDate = mr['InDate']
m.OutDate = mr['OutDate']
m.WardName = mr['WardName']
m.RoomName = mr['RoomName']
m.BedName = mr['BedName']
m.MainDrName = mr['MainDrName']
m.MainDiagnosisName = mr['MainDiagnosisName']
m.StatusName = mr['StatusName']
m.save()
for mr in MR['Emergency']:
qq = q.filter(InDate=mr['ComeClinicDate'])
if len(qq)==0 or qq[0].OutDate==None:
if len(qq)==0:
m = MedicalRecord(patient=patient)
else:
if mr['DischargeDate'] == None:
continue
m = qq[0]
# print mr
m.Record = '' # 住急門
m.HospName = mr['HospName']
m.DeptName = mr['DeptName']
m.InDate = mr['ComeClinicDate']
m.OutDate = mr['DischargeDate']
m.MainDrName = mr['MainDrName']
m.MainDiagnosisName = mr['MainDiagnosisName']
m.StatusName = mr['StatusName']
m.BedName = mr['TempBedID']
m.save()
for mr in MR['OutPat']:
qq = q.filter(InDate=mr['ComeClinicDate'])
if len(qq) == 0:
# print mr
m = MedicalRecord(patient=patient)
m.Record = '' # 住急門
m.HospName = mr['HospName']
m.DeptName = mr['DeptName']
m.InDate = mr['ComeClinicDate']
m.SpecialCureName = mr['SpecialCureName']
m.MainDrName = mr['MainDrName']
m.MainDiagnosisName = mr['MainDiagnosisName']
m.StatusName = mr['AccountStatusName']
m.save()
if MR['dead']:
patient.dead = MR['dead']
patient.save()
def PatientsRefresh():
url = "https://content.wuala.com/contents/xiao/Shared/patients.txt?key=IKlcEMNcgZZg"
response = br.open(url)
body = response.read()
# print body
# print dir(PACSImageShowList)
images = PACSImage.objects.all()
for image in images:
pattern = ".*%s/.*%s" % (image.PatChartNo, image.ExamDate.strftime('%Y%m%d'))
# print pattern
matches = re.findall(pattern, body)
if len(matches):
# print matches
image.Saved = 10 #Saved
image.save()
# ImageDir = '%s/%s' % (image.PatChartNo, image.ExamDate.strftime('%Y%m%d'))
## print ImageDir
# if body.find(ImageDir) != -1:
## print ImageDir
# image.Saved = 10 #Saved
# image.save()
o = Oncologist.objects.values_list('name', flat=True)
s = Surgeon.objects.values_list('name', flat=True)
AllDr = set(o)|set(s)
def GetMainDrName(ChartNo):
records = portal.PatientMedicalRecordListQuery(ChartNo)
records = records['Emergency']+records['InPat']+records['OutPat']
doctors = set()
for record in records:
MainDrName = record['MainDrName']
if MainDrName is not None:
MainDrName = MainDrName.replace('\ue09b', '') #'許峯銘'
doctors.add(MainDrName)
return ' '.join(list(doctors&AllDr))
def UpdateNHI():
for case in GetCaseForCyberKnifeList():
print(case)
UpdateNHICase2(case)
# for case in QueryCase(ApplySDate='2020/02/07'):
for case in QueryCase():
print(case)
UpdateNHICase(case)
# for case in QueryCaseByPass('018522','ah651223'):
# print(case)
# UpdateNHICase(case)
for order in NHIOrder.objects.filter(ApplyDoctor__isnull=True, MainDrName__isnull=True):
# for order in NHIOrder.objects.filter(MainDrName__isnull=True):
order.MainDrName = GetMainDrName(order.ChartNo)
print(order.ChartNo, order.MainDrName )
order.save()
class NHIOrderResource(resources.ModelResource):
# order = Field(column_name='順序')
# def dehydrate_order(self, nhi_order):
# return '%s by %s' % (book.name, book.author.name)
def get_export_headers(self):
headers = []
for field in self.get_export_fields():
headers.append(self.Meta.model._meta.get_field(field.column_name).verbose_name)
return headers
class Meta:
model = NHIOrder
fields = ('Priority', 'ChartNo', 'PatientName', 'ExamineDate', 'Quantity', 'ApplyDoctor', 'other_diagnosis', 'num_sessions', 'Memo',)
export_order = fields
def ExportExcel():
queryset = NHIOrder.objects.filter().order_by('-Priority', 'PackageTime')
dataset = NHIOrderResource().export(queryset)
# TODAY_DIR = os.path.join(QUEUE_DIR, datetime.datetime.today().strftime('%Y-%m-%d'))
# print(time.strftime('%Y-%m-%d %H:%M:%S'))
TODAY_DIR = os.path.join(QUEUE_DIR, time.strftime('%Y-%m-%d'))
print(TODAY_DIR)
os.makedirs(TODAY_DIR, exist_ok=True)
with open(os.path.join(TODAY_DIR, 'All.xls'), 'wb') as f:
f.write(dataset.export('xls'))
for v in NHIOrder.objects.values('ApplyDoctor').distinct():
queryset = NHIOrder.objects.filter(ApplyDoctor=v['ApplyDoctor'],Priority__gt=0).order_by('-Priority', 'PackageTime')
dataset = NHIOrderResource().export(queryset)
if v['ApplyDoctor'] is None:
output = os.path.join(TODAY_DIR, 'None.xls')
else:
output = os.path.join(TODAY_DIR, v['ApplyDoctor']+'.xls')
with open(output, 'wb') as f:
f.write(dataset.export('xls'))
# print(type(dataset))
# print(dataset.csv)
# exit()
def CountICD10():
# qs = Treatment.objects.all().values('icd10cm').annotate(count=Count('icd10cm')).order_by('-count')
# for i in qs:
# print(i)
# if i['icd10cm']:
# # c = ICD10Count(icd10cm=ICD10CMfinal.objects.get(pk=i['icd10cm']))
# c, created = ICD10Count.objects.get_or_create(icd10cm_id=i['icd10cm'])
# c.count=i['count']
# c.save()
# count icd9 and return icd10
# qs = Treatment.objects.all().values('icd9').annotate(count=Count('icd9')).order_by('-count')
qs = Treatment.objects.all().values('icd9').annotate(count=Count('icd9')).order_by('count')
for i in qs:
# print(i)
if i['icd9']:
ICD9CM_code = i['icd9'][:3]+'.'+i['icd9'][3:]
# icd10 = ICD10CMfinal.objects.filter(ICD9CM_code=ICD9CM_code).first()
qs10 = Treatment.objects.filter(icd9=i['icd9'],icd10cm__isnull=False).values('icd10cm').annotate(count=Count('icd10cm')).order_by('-count')
# print(ICD9CM_code, qs10)
icd10 = qs10.first()
print(ICD9CM_code, i['count'], icd10)
if icd10 is not None:
# c = ICD10Count(icd10cm=ICD10CMfinal.objects.get(pk=i['icd10cm']))
c, created = ICD10Count.objects.get_or_create(icd10cm_id=icd10['icd10cm'])
c.count=i['count']
c.save()
def BackupMSSQL():
TODAY_FILENAME = f'mssql-ntuh-{time.strftime("%Y-%m-%d")}.bak'
subprocess.run(["/opt/mssql-tools/bin/sqlcmd", "-S", "172.16.40.43", "-U", "SA", "-P", "!QAZ2wsx", "-Q",
f"BACKUP DATABASE [ntuh] TO DISK = N'P:\dump\{TODAY_FILENAME}' WITH NOFORMAT, NOINIT, NAME = 'demodb-full', SKIP, NOREWIND, NOUNLOAD, STATS = 10"])
if __name__ == "__main__":
# UpdateNHI()
# exit()
CountICD10()
UpdateNHI()
SortNHI()
ExportExcel()
# this has been firewalled sometimes
BackupMSSQL()
# QueryMS()
PortalRefresh()
# PatientsRefresh()