368 lines
11 KiB
Python
Executable file
368 lines
11 KiB
Python
Executable file
# -*- 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()
|
||
|