adm-ntuh-net/ntuh/registry/utils.py

369 lines
11 KiB
Python
Raw Normal View History

2024-12-12 02:19:16 +00:00
# -*- coding: utf-8 -*-
if __name__ == "__main__":
import os
import sys
import django
os.environ['DJANGO_SETTINGS_MODULE'] = 'ntuh.settings'
sys.path.append('../')
django.setup()
import logging
FORMAT = '%(asctime)s %(levelname)s %(message)s'
logging.basicConfig(format=FORMAT, level=logging.INFO)
from django.core.exceptions import ObjectDoesNotExist
from dateutil.relativedelta import relativedelta
# from ntuhgov.portal import operationnotelist, ShowOperationNote
from ntuhgov.portal_selenium import Login, SimpleQueryOpSchedule, OPNoteList, driver
from registry.models import *
import datetime
try:
import mod_wsgi
WSGI=True
# Put code here which should only run when mod_wsgi is being used.
except:
WSGI=False
pass
def str2date(str):
try:
return datetime.datetime.strptime(str,'%Y/%m/%d')
except:
return None
def ScanOperationNote(Chart, SESSION=None, Forced = False):
if SESSION is None:
SESSION = Login()
ChartStr = str(Chart)
while len(ChartStr) < 7:
ChartStr='0'+ChartStr
logging.info(('ScanOperationNote', Chart, ChartStr))
try:
opnotes = OPNoteList(ChartStr, SESSION)
except Exception as e:
logging.exception(e)
driver.save_screenshot("screenshot.png")
exit()
for item in opnotes:
if not Forced:
try:
op = OPNote.objects.get(KeyCode=item['KeyCode'])
# print KeyCode[i], 'existed'
continue
except:
pass
try:
print ('reading', item['KeyCode'])
except:
# print i, 'unfinished'
continue
department, date = item['KeyName'].split('_')
# content = ShowOperationNote(KeyCode[i], KeyName[i], SESSION)
# print content
# d = Discharge(Patient.objects.get(id=Chart))
# op = OPNote(KeyCode[i])
op, created = OPNote.objects.get_or_create(KeyCode=item['KeyCode'])
op.PatChartNo = Chart
# op.KeyCode = KeyCode[i]
op.KeyName = item['KeyName']
op.department = department
op.date = str2date(date)
# op.content = content
op.content = item['reportQuery']
op.save()
def SaveOP(DrCode, start = False, end = False, get_note=True, SESSION = None, NoCheck=[]):
if not SESSION:
SESSION = Login()
if not start:
(start, end) = prev_bounds()
# print DrCode, start, end
logging.info((DrCode, start, end))
# year = int(str(start)[:4])
try:
results = SimpleQueryOpSchedule(DrCode, start, end, SESSION, NoCheck=NoCheck)
except Exception as e:
logging.exception(e)
driver.save_screenshot("screenshot.png")
exit()
for r in results:
# ymd = r['OPDate'].split('/')
# m = int(ymd[-2])
# d = int(ymd[-1])
year, m, d = r['OPDate'].split('/')
year = int(year)
m = int(m)
d = int(d)
opdate = datetime.date(year, m, d)
today = datetime.date.today()
id = '%d/%02d/%02d-%s-%s-%s' % (year, m, d, r['OpRoomNo'], r['OpSeqNo'],r['PatChartNo'])
if not WSGI:
print (id, r['PatChartNo'], r['Complete'] )
NeedToClean = False
# Ignore Hsinchu branch like H171452
#try:
# PatChartNo = int(r['PatChartNo'])
#except:
# continue
try:
op = OPSchedule.objects.get(id=id)
except ObjectDoesNotExist:
# New records, check candidate records
ops = OPSchedule.objects.filter(OPDate=opdate, PatChartNo=r['PatChartNo']).exclude(Complete='完成').order_by('id')
# print len(ops)
if len(ops):
NeedToClean = True
# change the first matching 預計 to 實際
op = ops[0]
# print '%s->%s'%(op.id, id)
op.id = id
else:
op = OPSchedule.objects.create(id=id)
op.OPDate = opdate
try:
op.OpRoomNo = int(r['OpRoomNo'])
except:
op.OpRoomNo = r['OpRoomNo']
pass
try:
op.OpSeqNo = int(r['OpSeqNo'])
except:
pass
op.PatName = r['PatName']
op.PatWard = r['PatWard']
op.PatChartNo = r['PatChartNo']
op.PatSex = r['PatSex']
# op.PatAge = r['PatAgeTitle']
op.PatAge = r['PatAge']
if op.PatDignosis is None:
if 'PatDignosisTitle' in r:
op.PatDignosis = r['PatDignosisTitle']
else:
op.PatDignosis = r['PatDignosis']
if op.MainOpModeTitle is None and 'MainOpModeTitle' in r:
op.MainOpModeTitle = r['MainOpModeTitle']
op.MainOpMode = r['MainOpMode']
op.OpDoctorName = r['OpDoctorName']
op.OpTypeName = r['OpTypeName']
op.Complete = r['Complete']
op.Anes = r['Anes']
op.StartTime = r['StartTime']
op.SpendTime = r['SpendTime']
if 'Remark' in r:
op.Remark = r['Remark']
op.save()
if NeedToClean:
ops = OPSchedule.objects.filter(OPDate=opdate, PatChartNo=r['PatChartNo']).exclude(Complete='完成').exclude(id=id)
for op in ops:
# print "delete %s"%op.id
op.delete()
# exit()
# print "check1 %s %s" % (op.PatChartNo, op.OPDate)
if not get_note:
continue
if r['PatName'] == '': # Skip VIP
continue
if r['Complete'] != '完成':
continue
# print "check2 %s %s" % (op.PatChartNo, op.OPDate)
POD = (datetime.date.today() - op.OPDate).days
note_num = len(OPNote.objects.filter(PatChartNo = op.PatChartNo, date = op.OPDate))
if POD<28 and note_num<1:
# print "%s %s not existed, do ScanOperationNote" % (op.PatChartNo, op.OPDate)
ScanOperationNote(r['PatChartNo'], SESSION=SESSION, Forced=True)
def SaveOPAllDr(start = False, end = False, get_note=True, SESSION = None, NoCheck=[]):
if not SESSION:
SESSION = Login()
if not start:
(start, end) = prev_bounds()
# year = int(str(start)[:4])
IDList=[]
for ph in Physician.objects.all():
DrCode = ph.EmployeeID
# print DrCode, start, end
results = SimpleQueryOpSchedule(DrCode, start, end, SESSION, NoCheck=NoCheck)
for r in results:
# ymd = r['OPDate'].split('/')
# m = int(ymd[-2])
# d = int(ymd[-1])
year, m, d = r['OPDate'].split('/')
year = int(year)
m = int(m)
d = int(d)
opdate = datetime.date(year, m, d)
today = datetime.date.today()
id = '%d/%02d/%02d-%s-%s-%s' % (year, m, d, r['OpRoomNo'], r['OpSeqNo'],r['PatChartNo'])
IDList.append(id)
if not WSGI:
print (id, r['PatChartNo'], r['Complete'] )
NeedToClean = False
op, created = OPSchedule.objects.get_or_create(id=id)
op.OPDate = opdate
try:
op.OpRoomNo = int(r['OpRoomNo'])
except:
pass
try:
op.OpSeqNo = int(r['OpSeqNo'])
except:
pass
op.PatName = r['PatName']
op.PatWard = r['PatWard']
op.PatChartNo = r['PatChartNo']
op.PatSex = r['PatSex']
# op.PatAge = r['PatAgeTitle']
op.PatAge = r['PatAge']
if op.PatDignosis is None:
if 'PatDignosisTitle' in r:
op.PatDignosis = r['PatDignosisTitle']
else:
op.PatDignosis = r['PatDignosis']
if op.MainOpModeTitle is None and 'MainOpModeTitle' in r:
op.MainOpModeTitle = r['MainOpModeTitle']
op.MainOpMode = r['MainOpMode']
op.OpDoctorName = r['OpDoctorName']
op.OpTypeName = r['OpTypeName']
op.Complete = r['Complete']
op.Anes = r['Anes']
op.StartTime = r['StartTime']
op.SpendTime = r['SpendTime']
if 'Remark' in r:
op.Remark = r['Remark']
op.save()
#Will be clean at the end
# if NeedToClean:
# ops = OPSchedule.objects.filter(OPDate=opdate, PatChartNo=r['PatChartNo']).exclude(Complete='完成').exclude(id=id)
# for op in ops:
# print "delete %s"%op.id
# op.delete()
# exit()
if not get_note:
continue
if r['PatName'] == '': # Skip VIP
continue
if r['Complete'] != '完成':
continue
POD = (datetime.date.today() - op.OPDate).days
note_num = len(OPNote.objects.filter(PatChartNo = op.PatChartNo, date = op.OPDate))
if POD<7 and note_num<1:
# print "%s %s not existed, do ScanOperationNote" % (op.PatChartNo, op.OPDate)
ScanOperationNote(r['PatChartNo'], SESSION=SESSION, Forced=True)
# clean up schedule that is not "完成"
# print sorted(IDList)
# for s in OPSchedule.objects.filter(OPDate__gte=start, OPDate__lte=end).exclude(Complete='完成').order_by('id'):
for s in OPSchedule.objects.filter(OPDate__gte=start, OPDate__lte=end, Complete='未執行').order_by('id'):
if s.id not in IDList:
# print s.id
s.delete()
def RenewSchedule():
SESSION = Login()
# print SESSION
start = datetime.date.today() + relativedelta( days = -1 )
end = datetime.date.today() + relativedelta( weeks = 1 )
NoCheck = []
ops = OPSchedule.objects.filter(OPDate__gte = start, OPDate__lte = end)
for op in ops:
if op.Remark:
NoCheck.append(op.id)
# print NoCheck
SaveOPAllDr(start, end, get_note=False, SESSION=SESSION, NoCheck=NoCheck)
if __name__ == "__main__":
RenewSchedule()