adm-ntuh-net/ntuh/unf.py
2024-12-12 10:19:16 +08:00

415 lines
No EOL
10 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
### 已移至 M5A99FX 執行 ###
from operator import *
from ntuhgov.portal_spynner import *
import collections
import datetime
import multiprocessing
import os
import time
import sys
reload(sys)
sys.setdefaultencoding('utf8')
def get_path():
import os,sys
return os.path.realpath(os.path.dirname(sys.argv[0]))
def jprint(a):
import json
print json.dumps(a, ensure_ascii = False, indent=4, sort_keys=True)
import csv
# def unicode_csv_reader(unicode_csv_data, dialect=csv.excel, **kwargs):
# # csv.py doesn't do Unicode; encode temporarily as UTF-8:
# csv_reader = csv.reader(utf_8_encoder(unicode_csv_data),
# dialect=dialect, **kwargs)
# for row in csv_reader:
# # decode UTF-8 back to Unicode, cell by cell:
# yield [unicode(cell, 'utf-8') for cell in row]
# def utf_8_encoder(unicode_csv_data):
# for line in unicode_csv_data:
# yield line.encode('utf-8')
def unicode_csv_reader(utf8_data, dialect=csv.excel, **kwargs):
csv_reader = csv.reader(utf8_data, dialect=dialect, **kwargs)
for row in csv_reader:
yield [unicode(cell, 'utf-8') for cell in row]
# reader = csv.reader(open(get_path()+"/vs.csv", "rb"))
reader = unicode_csv_reader(open(get_path()+"/vs.csv", "rb"))
vs = {}
for row in reader:
# print row[1], row[0]
vs[row[1]]=row[0]
# exit()
def find_dir(*paths):
for path in paths:
if os.path.isdir(path):
return path
return ''
html_dir = find_dir(
# '/Shared/public_html',
'/home/xfr/workspace/media.ntuh.net/public_html',
'/home/ntuh/domains/media.ntuh.net/public_html',
'.')
def DivCode(v):
if v in vs:
div = vs[v]
else:
div = 'Other'
# print v, div
return div
def unf_start_end(a, b):
StartDate = (datetime.date.today() + datetime.timedelta(days=a)).strftime('%Y/%m/%d')
EndDate = (datetime.date.today() + datetime.timedelta(days=b)).strftime('%Y/%m/%d')
print StartDate, EndDate
list = WardQueryUncompletedChart(StartDate, EndDate)
'''
{
"主治": " ",
"住院": " ",
"姓名": "測試病人",
"帳號": "",
"床號": "YI2B2701",
"": "1",
"病歷號": "Y800001",
"科部": "SURG",
"結束日": "2013/12/30",
"": " ",
"逾期": "347",
"開始/手術日": "2013/12/26",
"類別": ""
}
'''
return list
def unf(days=30, dest='unf.html'):
list = unf_start_end(-365, 0)
# list = unf_start_end(-180, 0)
# list = unf_start_end(-90, 0)
# list = unf_start_end(-60, 0)
lt30 = []
ge30 = []
for r in list:
if 'H' in r['病歷號']:
continue
if 'Y' in r['病歷號']:
continue
try:
overdue = int(r['逾期'])
except:
continue
if overdue < days:
lt30.append(r)
else:
ge30.append(r)
# # jprint(r)
# print r['開始/手術日'], r['結束日'], r['主治'], r['住院'], r['逾期']
#
# exit()
vslt30 = collections.Counter([r['主治'] for r in lt30])
vsge30 = collections.Counter([r['主治'] for r in ge30])
dvlt30 = collections.Counter([DivCode(r['主治']) for r in lt30])
dvge30 = collections.Counter([DivCode(r['主治']) for r in ge30])
rlt30 = collections.Counter([r['住院'] for r in lt30])
rge30 = collections.Counter([r['住院'] for r in ge30])
print 'vslt30'
for elem, cnt in vslt30.most_common():
print elem, cnt
print 'vsge30'
for elem, cnt in vsge30.most_common():
print elem, cnt
dr1 = vslt30.most_common()
resident1 = rlt30.most_common()
division1 = dvlt30.most_common()
dr2 = vsge30.most_common()
resident2 = rge30.most_common()
division2 = dvge30.most_common()
print len(list), len(dr1), len(resident1)
if len(dr1) < 2:
return
length = max(
len(dr1),
len(resident1),
len(dr2),
len(resident2))
print length
result=[]
result.append(['主治醫師','科別','份數','住院醫師','份數','主治醫師','科別','份數','住院醫師','份數'])
d1 = 0
r1 = 0
d2 = 0
r2 = 0
for i in range(length):
r = []
if i < len(dr1):
r.append(dr1[i][0])
r.append(DivCode(dr1[i][0]))
r.append(dr1[i][1])
d1 += dr1[i][1]
else:
r.append('')
r.append('')
r.append('')
if i < len(resident1):
r.append(resident1[i][0])
r.append(resident1[i][1])
r1 += resident1[i][1]
else:
r.append('')
r.append('')
if i < len(dr2):
r.append(dr2[i][0])
r.append(DivCode(dr1[i][0]))
r.append(dr2[i][1])
d2 += dr2[i][1]
else:
r.append('')
r.append('')
r.append('')
if i < len(resident2):
r.append(resident2[i][0])
r.append(resident2[i][1])
r2 += resident2[i][1]
else:
r.append('')
r.append('')
result.append(r)
# output = open('/home/xfr/mysite/site_media/unf.html','w')
print '%s/%s' % (html_dir,dest)
output = open('%s/%s' % (html_dir,dest), 'w')
print >> output, """
<html>
<head>
<meta http-equiv=Content-Type content="text/html; charset=utf-8">
<title>外科部病歷未完成</title>
</head>
<body>
"""
print >> output, "<table><tbody align='center'>"
print >> output, "<tr><td colspan='10'>%s</td></tr>" % time.asctime()
print >> output, "<tr><td colspan='5'>逾期30日內</td><td colspan='5'>30日以上</td></tr>"
for r in result:
print >> output ,"<tr>"
for c in r:
print >> output, "<td>%s</td>" % c
print >> output ,"</tr>"
print >> output, "<tr><td>---</td></tr>"
print >> output, "<tr>"
print >> output, "<td>總計</td><td></td><td>%i</td>" % d1
print >> output, "<td>總計</td><td>%i</td>" % r1
print >> output, "<td>總計</td><td></td><td>%i</td>" % d2
print >> output, "<td>總計</td><td>%i</td>" % r2
print >> output, "</tr>"
print >> output, "</tbody></table>"
print >> output, "<hr/>"
print >> output, "<table><tbody align='center'>"
div1 = dict(division1)
div2 = dict(division2)
division3 = (dvlt30+dvge30).most_common()
print >> output, "<tr><td></td>"
for div, count in division3:
print >> output, "<td>%s</td>" % div
print >> output, "</tr>"
print >> output, "<tr><td>逾期30日內</td>"
for div, count in division3:
print >> output, "<td>%s</td>" % dvlt30[div]
print >> output, "</tr>"
print >> output, "<tr><td>30日以上</td>"
for div, count in division3:
print >> output, "<td>%s</td>" % dvge30[div]
print >> output, "</tr>"
print >> output, "<tr><td>合計</td>"
for div, count in division3:
print >> output, "<td>%s</td>" % count
print >> output, "</tr>"
print >> output, "</tbody></table>"
print >> output, "</body></html>"
output.close()
return result
def unf_month():
day = datetime.date.today().day
EndDate = datetime.date.today() + datetime.timedelta(days=-day)
# unf1 = unf_sort(-365,-day)
unf1 = unf_start_end(-365,-day)
dr1 = unf1['dr']
resident1 = unf1['resident']
division1 = unf1['division']
length = max(len(dr1),
len(resident1))
result=[]
result.append(['主治醫師','科別','份數','住院醫師','份數'])
d1 = 0
r1 = 0
for i in range(length):
r = []
if i < len(dr1):
r.append(dr1[i][0])
r.append(DivCode(dr1[i][0]))
r.append(dr1[i][1])
d1 += dr1[i][1]
else:
r.append('')
r.append('')
r.append('')
if i < len(resident1):
r.append(resident1[i][0])
r.append(resident1[i][1])
r1 += resident1[i][1]
else:
r.append('')
r.append('')
result.append(r)
# output = open('/home/xfr/mysite/site_media/unf.html','w')
output = open('%s/unf_month.html' % html_dir, 'w')
print >> output, """
<html>
<head>
<meta http-equiv=Content-Type content="text/html; charset=utf-8">
<title>上月外科部病歷未完成</title>
</head>
<body>
"""
print >> output, "<table><tbody align='center'>"
print >> output, "<tr><td colspan='5'>%s</td></tr>" % time.asctime()
print >> output, "<tr><td colspan='5'>%s前</td></tr>" % EndDate
for r in result:
print >> output ,"<tr>"
for c in r:
print >> output, "<td>%s</td>" % c
print >> output ,"</tr>"
print >> output, "<tr><td>---</td></tr>"
print >> output, "<tr>"
print >> output, "<td>總計</td><td></td><td>%i</td>" % d1
print >> output, "<td>總計</td><td>%i</td>" % r1
print >> output, "</tr>"
print >> output, "</tbody></table>"
print >> output, "<hr/>"
print >> output, "<table><tbody align='center'>"
div1 = dict(division1)
# print div1
# print div2
# print div3
division_sort = sorted(list(div1), key=lambda x: -div1[x])
# print division_sort
print >> output, "<tr><td></td>"
for div in division_sort:
print >> output, "<td>%s</td>" % div
print >> output, "</tr>"
print >> output, "<tr><td>合計</td>"
for div in division_sort:
print >> output, "<td>%s</td>" % div1[div]
print >> output, "</tr>"
print >> output, "</tbody></table>"
print >> output, "</body></html>"
output.close()
return result
# unf()
if __name__ == '__main__':
# Start foo as a process
p = multiprocessing.Process(target=unf)
p.start()
# # Wait 10 seconds for foo
# time.sleep(100)
# Wait a maximum of 10 seconds for foo
# Usage: join([timeout in seconds])
p.join(200)
# If thread is active
if p.is_alive():
print "foo is running... let's kill it..."
# Terminate foo
p.terminate()
p.join()