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

331 lines
12 KiB
Python

import datetime
from django.db.models import Q
from django.utils import timezone
import zeep
from .models import *
import ntuhgov.portal_selenium as portal
def UpdateNHICase(case):
# print(case)
if 'PackageTime' not in case:
case['PackageTime'] = case['ApplyDate']
if 'ApplyQty' in case:
case['ResultDesc'] = case['ApplyQty']
if case['PackageTime'] is not None:
case['PackageTime']=case['PackageTime'].replace('/','-')
if 'ExamineDate' in case and case['ExamineDate'] is not None:
case['ExamineDate']=case['ExamineDate'].replace('/','-')
if 'ApplyDate' in case and case['ApplyDate'] is not None:
case['ApplyDate']=case['ApplyDate'].replace('/','-')
if 'ApplyDoctor' in case and case['ApplyDoctor'] is not None:
case['ApplyDoctor']=case['ApplyDoctor'].replace('\ue09b', '') #'許峯銘'
if case['PackageTime'] is None:
return
# id = case['ChartNo']+'_'+case['PackageTime'][:4]
id = case['ChartNo']+'_'+case['PackageTime'][:7]
order = NHIOrder.objects.filter(id=id).first()
if order == None:
order = NHIOrder(id=id)
# print(order)
# exit()
# order, created = NHIOrder.objects.get_or_create(id=id)
for k, v in case.items():
# order[k] = v
# print(k,v)
if v is not None:
setattr(order, k, v)
if order.Priority is None:
if order.Quantity == '同意備查':
order.Priority = 1
order.save()
FirstPriority = 900
LastPriority = 100
def SortNHI(CheckTreated=True):
for v in NHIOrder.objects.values('ApplyDoctor').distinct():
if v['ApplyDoctor'] is None:
continue
print(v)
q = NHIOrder.objects.filter(ApplyDoctor=v['ApplyDoctor'],Priority__gt=0).order_by('-Priority', 'PackageTime')
total = len(q)
print(v['ApplyDoctor'], total)
if total < 1:
continue
priority = FirstPriority
d = (FirstPriority-LastPriority)/total
for order in q:
# check if treated
# patient = Patient.objects.get(medical_records=order.ChartNo)
if CheckTreated:
patient = Patient.objects.filter(medical_records=order.ChartNo).first()
if patient is not None:
print(patient, patient.medical_records)
for t in patient.treatment_set.all():
print(t.date_started, order.ExamineDate)
if (t.date_started is not None) and (order.ExamineDate is not None) and t.date_started > order.ExamineDate:
order.Priority = -1
# if v['ApplyDoctor'] is not None and order.Priority > 0:
if order.Priority > 0:
order.Priority = priority
priority -= d
order.save()
def AddPatient(d, force=True):
# r = portal.QueryModifyPatBase({'IdNo': idcode,
# 'ChartNo': chartno,
# })
p = None
r = portal.QueryModifyPatBase(d)
if r:
r['name'] = r['ChtName']
r['medical_records'] = r['ChartNo']
r['gender'] = r['Sex']
r['birthday'] = r['Birth']
r['address'] = r['AddressControl1']
r['phone'] = r['ContTel']
r['id_cards'] = r['IdNo']
result = [r]
else:
result = []
if force and len(result)>0:
r=result[0]
if r['gender'] == 'M':
r['gender'] = 1
else:
r['gender'] = 2
# hw = intra.HeightWeight(r['id_cards'])
# hw = ntuhgov.portal.HeightWeight(r['id_cards'])
hw = portal.BriefHistoryLink(r['id_cards'])
p = Patient(name = r['name'],
medical_records = r['medical_records'],
gender = r['gender'],
birthday = r['birthday'],
address = r['address'],
phone = r['phone'],
id_cards = r['id_cards'],
# height = hw['Height'],
weight = hw['Weight'],
)
try:
p.height = int(hw['Height'])
except:
pass
p.save()
return p
def QueryMS():
import mssql_ntuh.models as mssql
tzinfo=timezone.get_default_timezone()
# time_threshold = datetime.datetime.now() - datetime.timedelta(weeks=4)
# DateTimeField Treatment.timestamp received a naive datetime while time zone support is active.
time_threshold = timezone.now() - datetime.timedelta(weeks=4)
# qs = mssql.PatientAppointmentSchedule.objects.using('mssql-ntuh').all()
qs = mssql.PatientAppointmentSchedule.objects.using('mssql-ntuh').filter(appointment_date__gt=time_threshold)
for s in qs:
appointment_time = s.appointment_date.replace(tzinfo=tzinfo, hour=int(s.appointment_hour), minute=int(s.appointment_minutes))
if s.treatment_start_datetime:
start_time = s.treatment_start_datetime.replace(tzinfo=tzinfo)
elif s.checkin_datetime :
start_time = s.checkin_datetime.replace(tzinfo=tzinfo)
else:
start_time = s.appointment_date.replace(tzinfo=tzinfo, hour=int(s.appointment_hour), minute=int(s.appointment_minutes))
if s.treatment_complete_datetime:
end_time = s.treatment_complete_datetime.replace(tzinfo=tzinfo)
else:
end_time = start_time + datetime.timedelta(hours=1)
if s.treatment_room == 'MR':
end_time = max(end_time, start_time + datetime.timedelta(hours=1))
# start_time = timezone.make_aware(datetime.datetime.now(),timezone.get_default_timezone())
# start_time = timezone.get_default_timezone().localize(start_time)
# start_time = start_time.replace(tzinfo=tzinfo)
print(s.mapping_patient, s.treatment_room, s.appointment_date, s.checkin_datetime, s.queue_datetime, s.treatment_start_datetime, s.treatment_complete_datetime, s.fallrisktime, s.willtime)
mapping_patient = mssql.Patient.objects.using('mssql-ntuh').filter(id=s.mapping_patient).first()
# print(p.name)
# try:
# print(s.mapping_patient.name)
# except:
# #no patient found
# continue
print(s.id, s.main_diagnose, s.treatment_room, start_time, end_time)
# chartno = s.mapping_patient.record_no
patient = Patient.objects.filter(medical_records=s.record_no).first()
# print(patient)
if patient is None:
print('AddPatient', s.record_no, mapping_patient.name)
patient = AddPatient({'ChartNo': s.record_no})
if patient is None:
# false patient
continue
# print(patient.name)
treatment = patient.treatment_set.filter(Q(creation__gt=time_threshold) | Q(timestamp__gt=time_threshold)).order_by('-id').first()
if treatment is None:
print('Add Treatment', mapping_patient.record_no, mapping_patient.name)
treatment = Treatment(patient=patient)
treatment.save()
if treatment.surgeon is None and s.main_doctor:
treatment.surgeon = Surgeon.objects.filter(name=s.main_doctor).first()
if treatment.oncologist is None and s.rt_doctor:
treatment.oncologist = Oncologist.objects.filter(name=s.rt_doctor).first()
if treatment.other_diagnosis is None and s.main_diagnose:
treatment.other_diagnosis = s.main_diagnose
if s.treatment_room == 'CK':
if treatment.date_started is None or treatment.date_started > start_time.date():
treatment.date_started = start_time
if treatment.date_completed is None or treatment.date_completed < end_time.date():
treatment.date_completed = end_time
if treatment.bed is None and s.hospitalized_status:
treatment.bed = s.hospitalized_status
if treatment.icd10cm is None: # 找之前的健保申請
order = NHIOrder.objects.filter(ChartNo=s.record_no).order_by('-id').first()
if order is not None and order.ExamineDate is not None:
treatment.icd10cm = ICD10CMfinal.objects.filter(ICD10CM=order.Diagnosis).first()
count = patient.treatment_set.filter(Q(creation__gt=order.ExamineDate)).count()
if count <= 1:
treatment.accounting = 10
timestamp = max(treatment.creation, treatment.timestamp)
print(patient.name, treatment, timestamp)
print()
treatment.save()
vevent = treatment.vevent_set.filter(DESCRIPTION=s.id).first()
if vevent is None:
vevent = VEVENT(treatment=treatment,DESCRIPTION=s.id)
vevent.DTSTART = start_time
vevent.DURATION = str(end_time-start_time)
# print(vevent.DURATION, type(vevent.DURATION))
print(s.treatment_room)
if s.treatment_room == 'CK':
vevent.mode = 310
vevent.SUMMARY = patient.name+'治療'
elif s.treatment_room == 'MR':
vevent.mode = 220
vevent.SUMMARY = patient.name+'MRI'
elif s.treatment_room == 'HE':
vevent.mode = 100
vevent.SUMMARY = patient.name+'衛教'
elif s.treatment_room.startswith('CT'):
vevent.mode = 210
vevent.SUMMARY = patient.name+s.treatment_room
vevent.save()
print(len(qs))
def UpdateNHICase2(case):
print(case)
case = zeep.helpers.serialize_object(case)
if 'PackageTime' not in case:
case['PackageTime'] = case['ApplyDate']
if 'ApplyQty' in case:
case['ResultDesc'] = case['ApplyQty']
if 'ApplyDoctor' in case and case['ApplyDoctor'] is not None:
case['ApplyDoctor']=case['ApplyDoctor'].replace('\ue09b', '') #'許峯銘'
if case['PackageTime'] is None:
return
case['Quantity'] = case['ResultDesc']
case['ResultDesc'] = 1
case['ExamineQuantity'] = 1
case['NhiDeptName'] = case['NhiDept']
case['Diagnosis'] = case['DiagnosisCode']
# id = case['ChartNo']+'_'+case['PackageTime'][:4]
# print(case['PackageTime'].strftime('%Y-%m'))
id = case['ChartNo']+'_'+case['PackageTime'].strftime('%Y-%m')
order = NHIOrder.objects.filter(id=id).first()
if order == None:
order = NHIOrder(id=id)
# print(order)
# exit()
# order, created = NHIOrder.objects.get_or_create(id=id)
for k, v in case.items():
# order[k] = v
# print(k,v)
if v is not None:
setattr(order, k, v)
if order.Priority is None:
if order.Quantity == '同意備查':
order.Priority = 1
order.save()
def GetCaseForCyberKnifeList(days=30):
eDate = datetime.date.today()
sDate = eDate + datetime.timedelta(days=-days)
settings = zeep.Settings(strict=False, xml_huge_tree=True)
client = zeep.Client('https://converws.ntuh.gov.tw/WebApplication/NtuhACEService/CyberKnifeService.asmx?WSDL', settings=settings)
# client = zeep.Client('https://tconverws.ntuh.gov.tw/WebApplication/NtuhACEService/CyberKnifeService.asmx?WSDL', settings=settings)
result = client.service.GetCaseForCyberKnifeList('T0', sDate, eDate)
# print(len(result))
# exit()
return result