369 lines
11 KiB
Python
369 lines
11 KiB
Python
|
# -*- 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'] == 'ooo': # 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'] == 'ooo': # 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()
|
|||
|
|