diff --git a/ecs/jskult-webapp/src/controller/bio.py b/ecs/jskult-webapp/src/controller/bio.py index ed9d1931..7d4d8274 100644 --- a/ecs/jskult-webapp/src/controller/bio.py +++ b/ecs/jskult-webapp/src/controller/bio.py @@ -79,3 +79,22 @@ def search_bio( headers={'session_key': session_key} ) return templates_response + + +@router.post('/BioSearchListAjax') +def search_bio_ajax( + request: Request, + bio_form: Optional[BioModel] = Depends(BioModel.as_form), + bio_service: BioViewService = Depends(get_service(BioViewService)), + batch_status_service: BatchStatusService = Depends(get_service(BatchStatusService)) +): + session: UserSession = request.session + # バッチ処理中の場合、機能を利用させない + if batch_status_service.is_batch_processing(): + raise HTTPException(status_code=status.HTTP_403_FORBIDDEN, detail=constants.LOGOUT_REASON_BATCH_PROCESSING) + + # 生物由来データと件数を取得 + bio_sales_lot_data = bio_service.search_bio_data(bio_form) + bio_sales_lot_count = bio_service.count_bio_data(bio_form, session) + + return {'data': bio_sales_lot_data, 'count': bio_sales_lot_count} diff --git a/ecs/jskult-webapp/src/model/db/bio_sales_lot.py b/ecs/jskult-webapp/src/model/db/bio_sales_lot.py index 4bfed843..f3e36951 100644 --- a/ecs/jskult-webapp/src/model/db/bio_sales_lot.py +++ b/ecs/jskult-webapp/src/model/db/bio_sales_lot.py @@ -42,3 +42,7 @@ class BioSalesLotDBModel(BaseDBModel): data_kind: Optional[str] err_dtl_kind: Optional[str] expr_dt: Optional[date] + + +class BioSalesLotCountDBModel(BaseDBModel): + count: Optional[int] diff --git a/ecs/jskult-webapp/src/model/request/bio.py b/ecs/jskult-webapp/src/model/request/bio.py index b12861a6..3120f4ed 100644 --- a/ecs/jskult-webapp/src/model/request/bio.py +++ b/ecs/jskult-webapp/src/model/request/bio.py @@ -21,6 +21,8 @@ class BioModel(BaseModel): rev_hsdnymd_srk_from: Optional[str] rev_hsdnymd_srk_to: Optional[str] iko_flg: Optional[str] + pageNumber: Optional[int] + pageSize: Optional[int] @classmethod def as_form( @@ -34,7 +36,9 @@ class BioModel(BaseModel): ctrl_maker_cd: str = Form(None), ctrl_rev_hsdnymd_srk_from: str = Form(None), ctrl_rev_hsdnymd_srk_to: str = Form(None), - ikoFlg: str = Form(None) + ikoFlg: str = Form(None), + pageNumber: int = Form(None), + pageSize: int = Form(None) ): return cls.__convert_request_param( @@ -48,7 +52,9 @@ class BioModel(BaseModel): ctrl_maker_cd, ctrl_rev_hsdnymd_srk_from, ctrl_rev_hsdnymd_srk_to, - ikoFlg + ikoFlg, + pageNumber, + pageSize ) @classmethod @@ -91,7 +97,9 @@ class BioModel(BaseModel): ctrl_maker_cd: str, ctrl_rev_hsdnymd_srk_from: str, ctrl_rev_hsdnymd_srk_to: str, - ikoFlg: str + ikoFlg: str, + pageNumber: int = None, + pageSize: int = None ): wholesaler_code = None wholesaler_sub_code = None @@ -132,5 +140,7 @@ class BioModel(BaseModel): mkr_cd=ctrl_maker_cd, rev_hsdnymd_srk_from=rev_hsdnymd_srk_from, rev_hsdnymd_srk_to=rev_hsdnymd_srk_to, - iko_flg=ikoFlg + iko_flg=ikoFlg, + pageNumber=pageNumber, + pageSize=pageSize ) 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 7ad9e8cb..11d18663 100644 --- a/ecs/jskult-webapp/src/model/view/bio_view_model.py +++ b/ecs/jskult-webapp/src/model/view/bio_view_model.py @@ -152,6 +152,9 @@ class BioViewModel(BaseModel): 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 data_overflow_max_length(self): + return environment.BIO_SEARCH_RESULT_MAX_COUNT + def _format_date_string(self, date_string): if date_string is None: return '' diff --git a/ecs/jskult-webapp/src/repositories/bio_sales_lot_repository.py b/ecs/jskult-webapp/src/repositories/bio_sales_lot_repository.py index 10c7cba3..2fcd8db2 100644 --- a/ecs/jskult-webapp/src/repositories/bio_sales_lot_repository.py +++ b/ecs/jskult-webapp/src/repositories/bio_sales_lot_repository.py @@ -1,7 +1,8 @@ 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_lot import BioSalesLotDBModel +from src.model.db.bio_sales_lot import (BioSalesLotCountDBModel, + BioSalesLotDBModel) from src.model.request.bio import BioModel from src.repositories.base_repository import BaseRepository from src.system_var import environment @@ -67,12 +68,12 @@ class BioSalesLotRepository(BaseRepository): try: logger.debug('DB参照実行') where_clause = self.__build_condition(parameter) - # システムとしての最大取得件数 +1 まで取る - query = self.FETCH_SQL.format(where_clause=where_clause, limit=environment.BIO_SEARCH_RESULT_MAX_COUNT + 1) + # ページングで取得するため、LIMIT,OFFSETを指定 + limit_clause = self.__build_paging_limit_clauses(parameter) + query = self.FETCH_SQL.format(where_clause=where_clause, limit=limit_clause) logger.debug(f'SQL: {query}') result = self._database.execute_select(query, parameter.model_dump()) models = [BioSalesLotDBModel(**r) for r in result] - logger.debug(f'count= {len(models)}') return models except Exception as e: logger.exception(f"DB Error : Exception={e.args}") @@ -92,6 +93,35 @@ class BioSalesLotRepository(BaseRepository): logger.exception(f"DB Error : Exception={e.args}") raise e + COUNT_SQL = """\ + SELECT + COUNT(*) AS count + FROM + ( + SELECT 1 + FROM src05.bio_sales_lot + WHERE + {where_clause} + LIMIT {limit} + ) AS t\ + """ + + def fetch_count(self, parameter: BioModel) -> list[BioSalesLotDBModel]: + try: + logger.debug('DB参照実行') + where_clause = self.__build_condition(parameter) + # システムとしての最大取得件数 + 1まで取る + query = self.COUNT_SQL.format(where_clause=where_clause, limit=environment.BIO_SEARCH_RESULT_MAX_COUNT + 1) + logger.debug(f'SQL: {query}') + result = self._database.execute_select(query, parameter.model_dump()) + models = [BioSalesLotCountDBModel(**r) for r in result] + count = models[0].count if len(models) > 0 else 0 + logger.debug(f'count= {count}') + return count + except Exception as e: + logger.exception(f"DB Error : Exception={e.args}") + raise e + def __build_condition(self, parameter: BioModel): where_clauses: list[SQLCondition] = [] @@ -141,3 +171,9 @@ class BioSalesLotRepository(BaseRepository): logger.debug(f'条件設定終了:{where_clauses_str}') return where_clauses_str + + def __build_paging_limit_clauses(self, parameter: BioModel) -> str: + page_size = parameter.pageSize or 0 + page_number = parameter.pageNumber or 0 + + return f'{page_size} OFFSET {(page_number - 1) * page_size}' diff --git a/ecs/jskult-webapp/src/services/bio_view_service.py b/ecs/jskult-webapp/src/services/bio_view_service.py index cf9961ac..2436e994 100644 --- a/ecs/jskult-webapp/src/services/bio_view_service.py +++ b/ecs/jskult-webapp/src/services/bio_view_service.py @@ -71,6 +71,11 @@ class BioViewService(BaseService): return display_bio_data + def count_bio_data(self, search_params: BioModel, session: UserSession): + # 生物由来データの件数を取得 + bio_sales_data_count = self.bio_sales_repository.fetch_count(parameter=search_params) + return bio_sales_data_count + def search_download_bio_data( self, search_params: BioModel, diff --git a/ecs/jskult-webapp/src/templates/bioSearchList.html b/ecs/jskult-webapp/src/templates/bioSearchList.html index f0d47570..6fb17189 100644 --- a/ecs/jskult-webapp/src/templates/bioSearchList.html +++ b/ecs/jskult-webapp/src/templates/bioSearchList.html @@ -28,13 +28,13 @@ -