def parse_narc_content(content, n=0, to_queryset=False): soup = BeautifulSoup(content, 'html.parser') recs = RecordParser(records=[ OrderedDict((child.name, child.text) for child in table.children) for table in soup.find_all('table1') ], drop_if=lambda row: not row.get('narct_owarh_ymd') or row['drug_cd'] not in drugDB or not row.get('ptnt_no')) recs.select([ 'narct_owarh_ymd', 'ward', 'ori_ord_ymd', 'ord_no', 'ptnt_no', 'ptnt_nm', 'drug_cd', 'drug_nm', 'ord_qty_std', 'tot_qty', 'get_dept_nm' ], where=lambda row: row['ret_gb'] not in ['D/C', '반납', '수납취소']) recs.vlookup(drugDB.values(), 'drug_cd', 'code', [('amount', 0), ('amount_unit', ''), ('name', ""), ('std_unit', "")]) recs.format([('tot_qty', 0.0), ('ord_qty_std', 0.0)]) recs.add_column([('잔량', lambda row: row['tot_qty'] - row['ord_qty_std']), ('폐기량', lambda row: row['잔량'] * row['amount'])]) recs.update([('잔량', lambda row: round(row['잔량'], 2)), ('폐기량', lambda row: round(row['폐기량'], 2))]) recs.select('*', where=lambda row: row['잔량'] > 0).order_by( ['name', 'narct_owarh_ymd', 'ward']) if len(recs.records) == 0: return [], [] recs.rename([('narct_owarh_ymd', '불출일자'), ('ori_ord_ymd', '원처방일자'), ('ord_no', '처방번호[묶음]'), ('tot_qty', '집계량'), ('name', '폐기약품명'), ('drug_cd', '약품코드'), ('amount', '집계량'), ('ord_qty_std', '처방량(규격단위)'), ('drug_nm', '약품명'), ('amount_unit', '폐기단위'), ('ptnt_nm', '환자명'), ('ptnt_no', '환자번호'), ('std_unit', '규격단위'), ('ward', '병동')]) table = recs.select([ '불출일자', '병동', '환자번호', '환자명', '폐기약품명', '약품코드', '처방량(규격단위)', '잔량', '규격단위', '폐기량', '폐기단위', 'get_dept_nm' ]) table.add_column([('ord_amt', lambda row: row['처방량(규격단위)'])]) if to_queryset == False: table = table.to2darry() grp = recs.group_by( columns=['폐기약품명'], aggset=[('폐기량', sum, '폐기량__sum'), ('폐기약품명', len, '폐기약품명__len')], selects=['폐기약품명', '폐기약품명__len', '규격단위', '폐기량__sum', '폐기단위', '약품코드'], inplace=False) # grp = map(lambda row: round(row['폐기량__sum'], 2), grp) for row in grp: row['폐기량__sum'] = round(row['폐기량__sum'], 2) return table[n:], grp
def get_chemo_label_object(wards, ord_start_date, ord_end_date, start_dt, end_dt): from recordlib import RecordParser, read_excel drugs_recs = read_excel(DRUG_DB_PATH) odr = OrderSelectApiRequest(ord_start_date, ord_end_date, wards) odr.api_calls() records = odr.get_records() ord_recs = RecordParser(records=records, drop_if=lambda row: row.get('rcpt_dt', "") == "") # if real ord_recs.select('*', where=lambda row: start_dt <= row['rcpt_dt'] < end_dt) ord_recs.vlookup(drugs_recs, 'ord_cd', '약품코드', [('항암제구분', '0'), ('함량1', 0.0), ('함량단위1', ''), ('함량2', 0.0), ('함량단위2', '')]) ord_recs.format([('ord_qty', 0.0), ('함량1', 0.0), ('함량2', 0.0)]) ord_recs.add_column([('amt_vol', lambda row: row['ord_qty'] * row['함량1']), ('amt_wgt', lambda row: row['ord_qty'] * row['함량2'])]) chemo_index = ord_recs.select(['ord_ymd', 'rcpt_seq', 'medi_no', 'ord_no'], where=lambda row: row['항암제구분'] == '1', inplace=False).to2darry(headers=False) ord_recs.select('*', where=lambda r: [ r['ord_ymd'], r['rcpt_seq'], r['medi_no'], r['ord_no'] ] in chemo_index) detail = ord_recs.records.copy() f, l = ord_recs.min('rcpt_dt'), ord_recs.max('rcpt_dt') ord_recs.group_by(columns=['ord_ymd', 'rcpt_seq', 'medi_no', 'ord_cd'], aggset=[('amt_vol', sum, 'amt_vol_sum'), ('amt_wgt', sum, 'amt_wgt_sum'), ('ord_qty', sum, 'ord_qty_sum'), ('drug_nm', len, 'drug_nm_count')], selects=[ 'ord_cd', 'drug_nm', 'ord_unit_nm', 'amt_vol_sum', 'amt_wgt_sum', 'ord_qty_sum', '함량단위1', '함량단위2', 'drug_nm_count' ], inplace=True) ord_recs.add_column([('rcpt_dt_min', lambda x: f), ('rcpt_dt_max', lambda x: l)]) return ord_recs.records, detail # path = 'C:\\Users\\user\\Desktop\\집계표.xlsx' # ret = get_label_object(['P', 'S'], ['51', '52', '61', '71', '81', '92', 'IC'], '2017-04-09','2017-04-10', '2017-04-08 00:00:00', '2017-04-08 23:23:00') # ret.to_excel(path) # os.startfile(path) # get_label_object_test(['P', 'S'], ['51', '52', '61', '71', '81', '92', 'IC'], '2017-04-09','2017-04-10', '2017-04-08 00:00:00', '2017-04-08 23:23:00')
def get_chemo_label_object_test(wards, ord_start_date, ord_end_date, start_dt, end_dt): from recordlib import RecordParser, read_excel drugs_recs = read_excel(DRUG_DB_PATH) odr = OrderSelectApiRequest(ord_start_date, ord_end_date, wards) odr.set_test_response('response_samples/ordSelect51.sample.rsp') records = odr.get_records() ord_recs = RecordParser(records=records, drop_if=lambda row: row.get('rcpt_dt', "") == "") # if real # ord_recs.select('*', where= lambda row: start_dt <= row['rcpt_dt'] < end_dt) ord_recs.vlookup(drugs_recs, 'ord_cd', '약품코드', [('항암제구분', '0'), ('함량1', 0.0), ('함량단위1', ''), ('함량2', 0.0), ('함량단위2', '')]) ord_recs.format([('ord_qty', 0.0), ('함량1', 0.0), ('함량2', 0.0)]) ord_recs.add_column([('amt_vol', lambda row: row['ord_qty'] * row['함량1']), ('amt_wgt', lambda row: row['ord_qty'] * row['함량2'])]) chemo_index = ord_recs.select(['ord_ymd', 'rcpt_seq', 'medi_no', 'ord_no'], where=lambda row: row['항암제구분'] == '1', inplace=False).to2darry(headers=False) ord_recs.select('*', where=lambda r: [ r['ord_ymd'], r['rcpt_seq'], r['medi_no'], r['ord_no'] ] in chemo_index) detail = ord_recs.records.copy() f, l = ord_recs.min('rcpt_dt'), ord_recs.max('rcpt_dt') ord_recs.group_by(columns=['ord_ymd', 'rcpt_seq', 'medi_no', 'ord_cd'], aggset=[('amt_vol', sum, 'amt_vol_sum'), ('amt_wgt', sum, 'amt_wgt_sum'), ('ord_qty', sum, 'ord_qty_sum'), ('drug_nm', len, 'drug_nm_count')], selects=[ 'ord_cd', 'drug_nm', 'ord_unit_nm', 'amt_vol_sum', 'amt_wgt_sum', 'ord_qty_sum', '함량단위1', '함량단위2', 'drug_nm_count' ], inplace=True) ord_recs.add_column([('rcpt_dt_min', lambda x: f), ('rcpt_dt_max', lambda x: l)]) return ord_recs.records, detail
def get_label_object(kinds, types, wards, ord_start_date, ord_end_date, start_dt, end_dt): from recordlib import RecordParser, read_excel try: drug_db_recs = get_label_list() drug_db_recs = RecordParser( drug_db_recs, drop_if=lambda row: row['단일포장구분'] not in ['S', 'P']) except: drug_db_recs = read_excel( DRUG_DB_PATH, drop_if=lambda row: row['단일포장구분'] not in ['S', 'P']) pk_set = drug_db_recs.unique('약품코드') odr = OrderSelectApiRequest(ord_start_date, ord_end_date, wards) odr.api_calls() records = odr.get_records() ord_recs = RecordParser( records=records, drop_if=lambda row: row.get('ord_cd') not in pk_set or row.get( 'rcpt_dt', "") == "" or row.get('rcpt_ord_tp_nm') not in types) ord_recs.vlookup(drug_db_recs, 'ord_cd', '약품코드', [('단일포장구분', 'S')]) ord_recs.format([('ord_qty', 0.0), ('ord_frq', 0), ('ord_day', 0)]) ord_recs.select('*', where=lambda row: start_dt <= row['rcpt_dt'] < end_dt) ord_recs.add_column([ ('once_amt', lambda row: round(row['ord_qty'] / row['ord_frq'], 2)), ('total_amt', lambda row: row['ord_qty'] * row['ord_day']) ]) detail = ord_recs.records.copy() f, l = ord_recs.min('rcpt_dt'), ord_recs.max('rcpt_dt') ord_recs.group_by(columns=['단일포장구분', 'drug_nm'], aggset=[('ord_qty', sum, 'ord_qty_sum'), ('drug_nm', len, 'drug_nm_count'), ('total_amt', sum, 'total_amt_sum')], selects=[ '단일포장구분', 'ord_cd', 'drug_nm', 'ord_qty_sum', 'ord_unit_nm', 'drug_nm_count', 'total_amt_sum' ]) ord_recs.add_column([('rcpt_dt_min', lambda x: f), ('rcpt_dt_max', lambda x: l)]) ord_recs.value_map([('단일포장구분', {'S': '작은라벨', 'P': '큰라벨'}, '')]) return ord_recs.records, detail
def get_all(self, category="E", market_status='AS', page=1, set_detail=False): ''' present_code = {'Y':'급여', 'N': '비급여'} prodtype_code = {'E': '전문', 'O': '일반', 'Q': '의약외품'} market_status_code = {'AS': '유통/생산 중', 'AE': '유통/생산 미확인', 'AD': '유통/생산 중단'} ''' params = { "Page": page, "prodtype": category, "MktStatus": market_status } r = requests.get(self.get_all_url, params=params, headers=self.api_headers) soup = BeautifulSoup(r.text, 'html.parser') table = soup.find('div', {'class': 'search_result_list'}) tab_as = soup.find(id='tabAS') tab_ae = soup.find(id='tabAE') tab_ad = soup.find(id='tabAD') as_count = tab_as.text ret = [] for row in table('li'): img = row.find( 'img', {'src': re.compile(r'^/Data/DrugPictures_Small/.+$')}) img_src = img['src'] if img else '' subject = row.find(class_='subject_kr') if not subject: return ret href = subject.a['href'] if subject.a else '' name = subject.a.text if subject.a else '' pow_yesno = '불가' if row.find( 'span', {'class': re.compile('.*icon_crs')}) else '가능' cmpnt = row.find(class_='subject_eng') component = cmpnt.text if cmpnt else '' info_area = row.find(class_='info_area') price = info_area.find(class_='price') edi = info_area.find(class_='type') company = info_area.find(class_='company') present_val = info_area.find( 'span', {'class': re.compile('.+[YNX]')})['class'][1][-1] present_code = {'Y': '급여', 'N': '비급여'} prodtype_code = {'E': '전문', 'O': '일반', 'Q': '의약외품'} market_status_code = { 'AS': '유통/생산 중', 'AE': '유통/생산 미확인', 'AD': '유통/생산 중단' } ret.append({ 'market_status': market_status, 'prod_type': prodtype_code.get(category), 'img_src': urljoin(self.host, img_src) if img_src else '', 'href': urljoin(self.host, href), 'name': name, 'component_summary': component, 'company': company.text if company else '', 'edi': edi.text if edi else '', 'price': price.text.replace(',', '').replace('원', '') if price else '', 'drug_id': os.path.basename(href), 'powder_yesno': pow_yesno, 'present_yesno': present_code.get(present_val, '산정불가') }) if set_detail: recs_list = RecordParser(ret) id_list = recs_list.select(['drug_id'], inplace=False).to2darry(headers=False) id_list = [e[0] for e in id_list] with ThreadPoolExecutor(min(MAX_WORKER, len(ret))) as executor: details = executor.map(self.detail, id_list) recs_detail = RecordParser(list(details)) recs_list.vlookup(recs_detail, 'drug_id', 'drug_id', [('manufacture', ''), ('celler', ''), ('pkg_info', ''), ('official_sort', ''), ('components', ''), ('component_code', '')]) print('Detail: ', len(recs_detail)) return recs_list.records return ret