163 lines
5.4 KiB
Python

import json
from collections import OrderedDict
from datetime import datetime
from typing import Optional
from pydantic import BaseModel
from src.model.db.pharmacy_product_master import PharmacyProductMasterModel
from src.model.db.wholesaler_master import WholesalerMasterModel
from src.model.request.bio import BioModel
from src.model.view.bio_disp_model import BisDisplayModel
from src.system_var import environment
class BioViewModel(BaseModel):
subtitle: str = '生物由来検索一覧'
user_id: str
whs_models: list[WholesalerMasterModel]
phm_models: list[PharmacyProductMasterModel]
bio_data: Optional[list[BisDisplayModel]] = None
form_data: BioModel = None
excel_max_lines: int = str(environment.BIO_EXCEL_RESULT_MAX_COUNT)
def display_wholesaler_names(self):
display_names = [
f'{whs_model.rec_whs_cd}-{whs_model.rec_whs_sub_cd}:{whs_model.name or ""}'
for whs_model in self.whs_models
]
return display_names
def display_org_kbn(self):
return OrderedDict(
{
'': '',
'J': 'JD-NET',
'N': 'NHI',
'H': '手入力'
}
)
def display_data_kbn(self):
return OrderedDict(
{
'': '',
'0': '正常',
'1': 'ロットエラー',
'3': 'ロット不明',
'9': 'エラー(解消済み)',
'2': '除外'
}
)
def bio_data_json_str(self):
"""生物由来ロット分解データの検索結果を指定された件数ごとに分割しながら返す"""
def date_handler(obj):
"""json.dumpsの日付項目のフォーマットハンドラ"""
return obj.isoformat().replace('T', ' ') if hasattr(obj, 'isoformat') else obj
search_data_list = [model.model_dump() for model in self.bio_data]
search_data_len = len(search_data_list)
# 呼び出し一回あたりの分割数
part_size = 500
for i in range(0, search_data_len, part_size):
json_str = json.dumps(search_data_list[i:i + part_size], ensure_ascii=False, default=date_handler)
# JavaScriptに埋め込むため、バックスラッシュ、バッククォートをエスケープ
json_str = json_str.replace('\\', '\\\\')
json_str = json_str.replace("`", "\\`")
yield json_str
def make_whs_name(self):
if not self.is_form_submitted():
return ''
if self.form_data.rec_whs_cd is None:
return ''
form_wholesaler_full_name = \
f'{self.form_data.rec_whs_cd}-{self.form_data.rec_whs_sub_cd}:{self.form_data.whs_name}'
return form_wholesaler_full_name
def is_selected_whs_name(self, selected_wholesaler):
if not self.is_form_submitted():
return ''
form_wholesaler_full_name = \
f'{self.form_data.rec_whs_cd}-{self.form_data.rec_whs_sub_cd}:{self.form_data.whs_name}'
return self._selected_value(form_wholesaler_full_name, selected_wholesaler)
def is_selected_org_kbn(self, selected_org_kbn):
if not self.is_form_submitted():
return ''
return self._selected_value(self.form_data.slip_org_kbn, selected_org_kbn)
def is_input_rec_ymd_from(self):
if not self.is_form_submitted():
return ''
return self._format_date_string(self.form_data.rec_ymd_from)
def is_input_rec_ymd_to(self):
if not self.is_form_submitted():
return ''
return self._format_date_string(self.form_data.rec_ymd_to)
def is_input_lot_num(self):
if not self.is_form_submitted():
return ''
return self.form_data.rec_lot_num or ''
def is_selected_data_kbn(self, selected_data_kbn):
if not self.is_form_submitted():
return ''
return self._selected_value(self.form_data.data_kbn, selected_data_kbn)
def is_selected_maker_cd(self, selected_maker_cd):
if not self.is_form_submitted():
return ''
return self._selected_value(self.form_data.mkr_cd, selected_maker_cd)
def is_input_rev_hsdnymd_srk_from(self):
if not self.is_form_submitted():
return ''
return self._format_date_string(self.form_data.rev_hsdnymd_srk_from)
def is_input_rev_hsdnymd_srk_to(self):
if not self.is_form_submitted():
return ''
return self._format_date_string(self.form_data.rev_hsdnymd_srk_to)
def is_checked_iko_flg(self):
if not self.is_form_submitted():
return ''
return 'checked' if self.form_data.iko_flg else ''
def disabled_button(self):
return 'disabled' if self.is_data_empty() or self.is_data_overflow_max_length() else ''
def is_form_submitted(self):
return self.form_data is not None
def is_data_empty(self):
return self.bio_data is None or len(self.bio_data) == 0
def is_data_overflow_max_length(self):
return self.bio_data is None or len(self.bio_data) > environment.BIO_SEARCH_RESULT_MAX_COUNT
def _format_date_string(self, date_string):
if date_string is None:
return ''
date = datetime.strptime(date_string, '%Y%m%d')
return date.strftime('%Y/%m/%d')
def _selected_value(self, form_value: str, current_value: str):
return 'selected' if form_value == current_value else ''