From aa8dd9fc597659053c22cf65451a61da255ea3d2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=87=8E=E9=96=93?= Date: Thu, 27 Jul 2023 13:14:13 +0900 Subject: [PATCH] Revert "Revert "Merge branch 'feature-NEWDWH2021-1070' into feature-NEWDWH2021-1069"" This reverts commit 707f7f6839a1d533c5cb1c162a482fe3b9370359. --- .../src/controller/bio_download.py | 27 +--- .../src/data/BioData_template.xlsx | Bin 10348 -> 10423 bytes .../{bio_sales_view.py => bio_sales_lot.py} | 41 ++----- .../src/model/db/pharmacy_product_master.py | 1 + .../src/model/view/bio_disp_model.py | 17 +-- .../src/model/view/bio_view_model.py | 29 ++++- ...ository.py => bio_sales_lot_repository.py} | 74 +++++++---- .../pharmacy_product_master_repository.py | 1 + .../src/services/bio_view_service.py | 29 +++-- ecs/jskult-webapp/src/static/css/bioStyle.css | 18 ++- ecs/jskult-webapp/src/system_var/constants.py | 44 +------ .../src/templates/bioSearchList.html | 115 ++++++++++-------- 12 files changed, 198 insertions(+), 198 deletions(-) rename ecs/jskult-webapp/src/model/db/{bio_sales_view.py => bio_sales_lot.py} (61%) rename ecs/jskult-webapp/src/repositories/{bio_sales_view_repository.py => bio_sales_lot_repository.py} (75%) diff --git a/ecs/jskult-webapp/src/controller/bio_download.py b/ecs/jskult-webapp/src/controller/bio_download.py index 8ff711c8..454ff857 100644 --- a/ecs/jskult-webapp/src/controller/bio_download.py +++ b/ecs/jskult-webapp/src/controller/bio_download.py @@ -60,12 +60,8 @@ async def download_bio_data( logger.info('検索結果が0件です') return {'status': 'ok', 'download_url': None} - # ファイルに打ち出すカラムを抽出 - # TODO: SQLクエリを修正するため、この処理は不要になる - extract_df = _extract_output_df(search_result_df) - # ファイルを書き出し(Excel or CSV) - local_file_path = _write_bio_data_to_file(bio_service, download_param, extract_df, download_file_name) + local_file_path = _write_bio_data_to_file(bio_service, download_param, search_result_df, download_file_name) # ローカルファイルからS3にアップロードし、ダウンロード用URLを取得する try: @@ -116,27 +112,6 @@ def _search_bio_data(bio_service: BioViewService, search_param: BioModel, user_i return search_result_df, query -def _extract_output_df(search_result_df: pd.DataFrame) -> pd.DataFrame: - extract_df = search_result_df[constants.BIO_EXTRACT_COLUMNS] - - # 値を変換 - # データ種別の正式名を設定 - extract_df.loc[:, 'slip_org_kbn'] = extract_df['slip_org_kbn'].apply( - lambda key: constants.SLIP_ORG_KBN_FULL_NAME.get(key)) - # データ区分の区分の日本語名を設定 - extract_df.loc[:, 'data_kbn'] = extract_df['data_kbn'].apply(lambda key: constants.DATA_KBN_JP_NAME.get(key)) - # ロット番号エラーフラグの日本語名を設定 - extract_df.loc[:, 'lot_num_err_flg'] = extract_df['lot_num_err_flg'].apply( - lambda key: constants.LOT_NO_ERR_FLG_JP_NAME.get(key)) - # 訂正前伝票管理番号がセットされているときのみ修正日時、修正者、エラー詳細種別をセット - extract_df.loc[:, 'ins_dt'] = extract_df['bef_slip_mgt_num'].apply( - lambda bef_slip_mgt_num: extract_df['ins_dt'] if bef_slip_mgt_num is not None else '') - extract_df.loc[:, 'ins_usr'] = extract_df['bef_slip_mgt_num'].apply( - lambda bef_slip_mgt_num: extract_df['ins_usr'] if bef_slip_mgt_num is not None else '') - - return extract_df - - def _write_bio_data_to_file( bio_service: BioViewService, download_param: BioDownloadModel, diff --git a/ecs/jskult-webapp/src/data/BioData_template.xlsx b/ecs/jskult-webapp/src/data/BioData_template.xlsx index 4a6292ff20b0ab793c282b122e8254d682f6ee53..ec1575a2932f20bd823620b1001e6192ca7f420b 100644 GIT binary patch delta 4416 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 SUjP6=b=|wJA+LD None: +class BisDisplayModel(BioSalesLotDBModel): + def __init__(self, param: BioSalesLotDBModel) -> None: super().__init__(**param.dict()) - - # 区分・フラグの正式名称を設定 - self.slip_org_kbn = constants.SLIP_ORG_KBN_FULL_NAME.get(self.slip_org_kbn) - self.data_kbn = constants.DATA_KBN_JP_NAME.get(self.data_kbn) - self.lot_no_err_flg = constants.LOT_NO_ERR_FLG_JP_NAME.get(self.lot_no_err_flg) - - # 訂正前伝票管理番号がセットされているときのみ修正日時、修正者、エラー詳細種別をセット - if (self.bef_slip_mgt_num is None): - self.ins_dt = "" - self.ins_usr = "" diff --git a/ecs/jskult-webapp/src/model/view/bio_view_model.py b/ecs/jskult-webapp/src/model/view/bio_view_model.py index 8f5e4875..57d5f153 100644 --- a/ecs/jskult-webapp/src/model/view/bio_view_model.py +++ b/ecs/jskult-webapp/src/model/view/bio_view_model.py @@ -23,7 +23,7 @@ class BioViewModel(BaseModel): def display_wholesaler_names(self): display_names = [ - f'{whs_model.rec_whs_cd}-{whs_model.rec_whs_sub_cd}:{whs_model.name}' + 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 @@ -45,15 +45,38 @@ class BioViewModel(BaseModel): '0': '正常', '1': 'ロットエラー', '3': 'ロット不明', - '9': 'エラー(解消済)', + '9': 'エラー(解消済み)', '2': '除外' } ) def bio_data_json_str(self): + """生物由来ロット分解データの検索結果を指定された件数ごとに分割しながら返す""" def date_handler(obj): + """json.dumpsの日付項目のフォーマットハンドラ""" return obj.isoformat() if hasattr(obj, 'isoformat') else obj - return json.dumps([model.dict() for model in self.bio_data], ensure_ascii=False, default=date_handler) + + search_data_list = [model.dict() 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(): diff --git a/ecs/jskult-webapp/src/repositories/bio_sales_view_repository.py b/ecs/jskult-webapp/src/repositories/bio_sales_lot_repository.py similarity index 75% rename from ecs/jskult-webapp/src/repositories/bio_sales_view_repository.py rename to ecs/jskult-webapp/src/repositories/bio_sales_lot_repository.py index 46eb2b91..28a59ea5 100644 --- a/ecs/jskult-webapp/src/repositories/bio_sales_view_repository.py +++ b/ecs/jskult-webapp/src/repositories/bio_sales_lot_repository.py @@ -1,7 +1,7 @@ from src.db import sql_condition as condition from src.db.sql_condition import SQLCondition from src.logging.get_logger import get_logger -from src.model.db.bio_sales_view import BioSalesViewModel +from src.model.db.bio_sales_lot import BioSalesLotDBModel from src.model.request.bio import BioModel from src.repositories.base_repository import BaseRepository from src.util.string_util import is_not_empty @@ -9,37 +9,59 @@ from src.util.string_util import is_not_empty logger = get_logger('生物由来参照') -class BioSalesViewRepository(BaseRepository): +class BioSalesLotRepository(BaseRepository): FETCH_SQL = """\ SELECT - ( - CASE - WHEN LEFT(bs.v_tran_cd, 1) = 2 - AND bs.qty >= 1 THEN CONCAT('-', bs.qty) - ELSE bs.qty - END - ) AS amt_fugo, - bs.*, - ln.ser_num, - ln.lot_num, - ln.expr_dt + data_kind, + slip_mgt_num, + rec_ymd, + rec_whs_cd, + rec_whs_sub_cd, + whs_name, + rec_whs_org_cd, + rec_urag_num, + rev_hsdnymd_srk, + rec_tran_kbn, + tran_kbn_name, + mkr_cd, + rec_comm_cd, + product_name, + whs_rep_comm_name, + nonyu_fcl_cd, + rec_nonyu_fcl_name, + whs_rep_nonyu_fcl_name, + rec_nonyu_fcl_addr, + whs_rep_nonyu_fcl_addr, + rec_lot_num, + qty, + expr_dt, + data_kbn, + err_dtl_kind, + bef_slip_mgt_num, + ins_usr, + ins_dt, + inst_cd, + inst_name_form, + address, + tel_num, + v_whs_cd, + v_whsorg_cd, + whs_org_name, + v_tran_cd, + iko_flg FROM - src05.bio_sales_view bs - LEFT OUTER JOIN - src05.lot_num_mst ln - ON bs.mkr_cd = ln.ser_num - AND bs.rec_lot_num = ln.lot_num + src05.bio_sales_lot WHERE {where_clause} ORDER BY - bs.rec_whs_cd, - bs.rec_whs_sub_cd, - bs.rev_hsdnymd_srk, - bs.slip_mgt_num + rec_whs_cd, + rec_whs_sub_cd, + rev_hsdnymd_srk, + slip_mgt_num ASC\ """ - def fetch_many(self, parameter: BioModel) -> list[BioSalesViewModel]: + def fetch_many(self, parameter: BioModel) -> list[BioSalesLotDBModel]: try: self._database.connect() logger.debug('DB参照実行') @@ -48,7 +70,7 @@ class BioSalesViewRepository(BaseRepository): logger.debug(f'SQL: {query}') result = self._database.execute_select(query, parameter.dict()) logger.debug(f'count= {len(result)}') - models = [BioSalesViewModel(**r) for r in result] + models = [BioSalesLotDBModel(**r) for r in result] return models except Exception as e: logger.exception(f"DB Error : Exception={e.args}") @@ -93,8 +115,8 @@ class BioSalesViewRepository(BaseRepository): if is_not_empty(parameter.rec_lot_num): rec_lot_num = parameter.rec_lot_num # あいまい検索文字列('%')が含まれる場合は'LIKE'、でなければ'='で検索 - rec_lot_num_comparator = condition.LIKE if rec_lot_num in '%' else condition.EQ - where_clauses.append(SQLCondition('rec_lot_num', rec_lot_num_comparator, 'rec_lot_num')) + rec_lot_num_comparator = condition.LIKE if '%' in rec_lot_num else condition.EQ + where_clauses.append(SQLCondition('TRIM(rec_lot_num)', rec_lot_num_comparator, 'rec_lot_num')) # データ区分 if is_not_empty(parameter.data_kbn): where_clauses.append(SQLCondition('data_kbn', condition.EQ, 'data_kbn')) diff --git a/ecs/jskult-webapp/src/repositories/pharmacy_product_master_repository.py b/ecs/jskult-webapp/src/repositories/pharmacy_product_master_repository.py index a430ee67..c2bd95ed 100644 --- a/ecs/jskult-webapp/src/repositories/pharmacy_product_master_repository.py +++ b/ecs/jskult-webapp/src/repositories/pharmacy_product_master_repository.py @@ -9,6 +9,7 @@ class PharmacyProductMasterRepository(BaseRepository): FETCH_SQL = """\ SELECT + t1.mkr_cd, CONCAT(IFNULL(t1.mkr_cd, ''), ' ', IFNULL(t1.mkr_inf_1, '')) AS mkr_cd_name FROM src05.phm_prd_mst_v t1 diff --git a/ecs/jskult-webapp/src/services/bio_view_service.py b/ecs/jskult-webapp/src/services/bio_view_service.py index d1102598..f77a6a5b 100644 --- a/ecs/jskult-webapp/src/services/bio_view_service.py +++ b/ecs/jskult-webapp/src/services/bio_view_service.py @@ -12,7 +12,7 @@ from src.model.request.bio import BioModel from src.model.view.bio_disp_model import BisDisplayModel from src.model.view.bio_view_model import BioViewModel from src.repositories.base_repository import BaseRepository -from src.repositories.bio_sales_view_repository import BioSalesViewRepository +from src.repositories.bio_sales_lot_repository import BioSalesLotRepository from src.repositories.pharmacy_product_master_repository import \ PharmacyProductMasterRepository from src.repositories.wholesaler_master_repository import \ @@ -27,7 +27,7 @@ class BioViewService(BaseService): REPOSITORIES = { 'whs_repository': WholesalerMasterRepository, 'phm_repository': PharmacyProductMasterRepository, - 'bio_sales_repository': BioSalesViewRepository + 'bio_sales_repository': BioSalesLotRepository } CLIENTS = { @@ -36,7 +36,7 @@ class BioViewService(BaseService): whs_repository: WholesalerMasterRepository phm_repository: PharmacyProductMasterRepository - bio_sales_repository: BioSalesViewRepository + bio_sales_repository: BioSalesLotRepository s3_client: S3Client def __init__(self, repositories: dict[str, BaseRepository], clients: dict[str, AWSAPIClient]) -> None: @@ -119,6 +119,9 @@ class BioViewService(BaseService): logger.info(parameter_message) access_logger.info(parameter_message) + # ログファイルクローズ + access_log_handler.close() + # S3にアップロード self.upload_bio_access_log_file(access_log_file_path) @@ -153,14 +156,16 @@ class BioViewService(BaseService): header_df = pd.DataFrame([header_data], index=None) output_df = pd.concat([header_df, data_frame]) # ヘッダー行としてではなく、1レコードとして出力する - output_df.to_csv(output_file_path, index=False, header=False) + output_df.to_csv(output_file_path, index=False, header=False, encoding="utf-8_sig") return output_file_path def upload_bio_data_file(self, local_file_path: str) -> None: bucket_name = environment.BIO_ACCESS_LOG_BUCKET - # TODO: ファイルパスにYYYY/MM/DDを加える - file_key = f'data/{os.path.basename(local_file_path)}' + + dt_now = datetime.now() + ymd = f'{dt_now.year}/{dt_now.strftime("%m")}/{dt_now.strftime("%d")}' + file_key = f'data/{ymd}/{os.path.basename(local_file_path)}' self.s3_client.upload_file(local_file_path, bucket_name, file_key) # アップロード後、ローカルからは削除する @@ -168,8 +173,10 @@ class BioViewService(BaseService): def upload_bio_access_log_file(self, local_file_path: str) -> None: bucket_name = environment.BIO_ACCESS_LOG_BUCKET - # TODO: ファイルパスにYYYY/MM/DDを加える - file_key = f'log/{os.path.basename(local_file_path)}' + + dt_now = datetime.now() + ymd = f'{dt_now.year}/{dt_now.strftime("%m")}/{dt_now.strftime("%d")}' + file_key = f'log/{ymd}/{os.path.basename(local_file_path)}' self.s3_client.upload_file(local_file_path, bucket_name, file_key) # アップロード後、ローカルからは削除する @@ -177,8 +184,10 @@ class BioViewService(BaseService): def generate_download_file_url(self, local_file_path: str, user_id: str, kind: str) -> str: bucket_name = environment.BIO_ACCESS_LOG_BUCKET - # TODO: ファイルパスにYYYY/MM/DDを加える - file_key = f'data/{os.path.basename(local_file_path)}' + + dt_now = datetime.now() + ymd = f'{dt_now.year}/{dt_now.strftime("%m")}/{dt_now.strftime("%d")}' + file_key = f'data/{ymd}/{os.path.basename(local_file_path)}' download_filename = f'{user_id}_生物由来卸販売データ.{kind}' return self.s3_client.generate_presigned_url(bucket_name, file_key, download_filename) diff --git a/ecs/jskult-webapp/src/static/css/bioStyle.css b/ecs/jskult-webapp/src/static/css/bioStyle.css index 7ecde3c5..0eadc543 100644 --- a/ecs/jskult-webapp/src/static/css/bioStyle.css +++ b/ecs/jskult-webapp/src/static/css/bioStyle.css @@ -81,9 +81,25 @@ table{ .bioScroll_div { overflow: auto; + white-space: nowrap; margin-top: 1%; + margin-bottom: 1%; + width: 100%; height: 250px; - width: 1132px; +} +.bioScroll_div::-webkit-scrollbar { + height: 5px; + width: 10px; +} + +.bioScroll_div::-webkit-scrollbar-track { + border-radius: 5px; + background: #eee; +} + +.bioScroll_div::-webkit-scrollbar-thumb { + border-radius: 5px; + background: #666; } .noLine{ diff --git a/ecs/jskult-webapp/src/system_var/constants.py b/ecs/jskult-webapp/src/system_var/constants.py index a50d498e..7be637b9 100644 --- a/ecs/jskult-webapp/src/system_var/constants.py +++ b/ecs/jskult-webapp/src/system_var/constants.py @@ -5,49 +5,11 @@ BATCH_STATUS_PROCESSING = '1' # 日付テーブル.dump取得状態区分:未処理 DUMP_STATUS_UNPROCESSED = '0' +# 生物由来照会 + BIO_TEMPORARY_FILE_DIR_PATH = path.join(path.curdir, 'src', 'data') BIO_EXCEL_TEMPLATE_FILE_PATH = path.join(BIO_TEMPORARY_FILE_DIR_PATH, 'BioData_template.xlsx') -BIO_EXTRACT_COLUMNS = [ - 'slip_org_kbn', - 'slip_mgt_num', - 'rec_ymd', - 'rec_whs_cd', - 'rec_whs_sub_cd', - 'whs_name', - 'rec_whs_org_cd', - 'rec_urag_num', - 'rev_hsdnymd_srk', - 'rec_tran_kbn', - 'tran_kbn_name', - 'mkr_cd', - 'rec_comm_cd', - 'product_name', - 'whs_rep_comm_name', - 'nonyu_fcl_cd', - 'rec_nonyu_fcl_name', - 'whs_rep_nonyu_fcl_name', - 'rec_nonyu_fcl_addr', - 'whs_rep_nonyu_fcl_addr', - 'rec_lot_num', - 'amt_fugo', - 'expr_dt', - 'data_kbn', - 'lot_num_err_flg', - 'bef_slip_mgt_num', - 'ins_usr', - 'ins_dt', - 'inst_cd', - 'inst_name_form', - 'address', - 'tel_num', - 'v_whs_cd', - 'v_whsorg_cd', - 'whs_org_name', - 'v_tran_cd', - 'iko_flg' -] - BIO_CSV_HEADER = [ 'データ種別', '伝票管理NO', @@ -85,7 +47,7 @@ BIO_CSV_HEADER = [ 'Veeva卸組織コード', '卸組織名', 'Veeva取引区分コード', - '移行' + '2017年11月以前データ' ] SLIP_ORG_KBN_FULL_NAME = { diff --git a/ecs/jskult-webapp/src/templates/bioSearchList.html b/ecs/jskult-webapp/src/templates/bioSearchList.html index ae7a3d7c..4dafce34 100644 --- a/ecs/jskult-webapp/src/templates/bioSearchList.html +++ b/ecs/jskult-webapp/src/templates/bioSearchList.html @@ -5,16 +5,16 @@ {% include '_header.html' %} {% endwith %} - - @@ -52,16 +52,14 @@ 処理日: - ~ - @@ -76,7 +74,7 @@ @@ -86,7 +84,7 @@ {% for phm in bio.phm_models %} {% endfor %} @@ -96,16 +94,14 @@ 発伝年月日: - ~ - @@ -130,9 +126,9 @@
- +
- + @@ -169,7 +165,7 @@ - + @@ -186,6 +182,18 @@ {% endif %} + + + + + + + + + + + +
データ種別 伝票管理NO 処理日Veeva卸組織コード 卸組織名 Veeva取引区分コード移行2017年11月以前データ