feat: CSVダウンロード画面追加

This commit is contained in:
高木要 2023-07-14 14:28:36 +09:00
parent a3624903cf
commit a1d71275f0
12 changed files with 636 additions and 130 deletions

View File

@ -10,6 +10,7 @@ COGNITO_CLIENT_SECRET=******************************
SESSION_TABLE_NAME=***********************
##S3
BIO_ACCESS_LOG_BUCKET=*******************
MASTER_MAINTENANCE_BUCKET=mbj-newdwh2021-staging-jskult-master-maintenance
#MySQL
DB_HOST=************
DB_PORT=************

View File

@ -1,9 +1,13 @@
from datetime import datetime
from typing import Optional
from fastapi import APIRouter, Depends, HTTPException, Request
from fastapi.responses import HTMLResponse
from starlette import status
from src.error.exceptions import DBException
import pandas as pd
from src.depends.services import get_service
from src.logging.get_logger import get_logger
from src.model.internal.session import UserSession
from src.model.view.inst_emp_csv_download_view_model import \
InstEmpCsvDownloadViewModel
@ -19,9 +23,11 @@ from src.services.session_service import set_session
from src.system_var import constants
from src.templates import templates
from src.model.request.master_mainte_csvup import MasterMainteCsvUpModel
from fastapi import APIRouter, File, Form, Request
from src.model.request.master_mainte_csvdl import MasterMainteCsvDlModel
from io import TextIOWrapper, BytesIO
logger = get_logger('マスターメンテ')
router = APIRouter()
router.route_class = AuthenticatedRoute
@ -133,7 +139,7 @@ async def inst_emp_csv_upload(
# 画面表示用のモデル
mainte_csv_up = master_mainte_service.prepare_mainte_csv_up_view(
TextIOWrapper(BytesIO(await csv_upload_form.csv_file.read())),
TextIOWrapper(BytesIO(await csv_upload_form.csv_file.read()), encoding='utf-8'),
csv_upload_form.csv_file.filename,
csv_upload_form)
# セッション書き換え
@ -217,7 +223,9 @@ def inst_emp_csv_download_view(
raise HTTPException(status_code=status.HTTP_403_FORBIDDEN, detail=constants.LOGOUT_REASON_BACKUP_PROCESSING)
# 画面表示用のモデル
view_model = InstEmpCsvDownloadViewModel()
mainte_csv_dl = InstEmpCsvDownloadViewModel(
is_search=False
)
# セッション書き換え
session.update(
actions=[
@ -230,7 +238,98 @@ def inst_emp_csv_download_view(
'instEmpCsvDL.html',
{
'request': request,
'view': view_model
'mainte_csv_dl': mainte_csv_dl
},
headers={'session_key': session.session_key}
)
return templates_response
@router.post('/download', response_class=HTMLResponse)
async def inst_emp_csv_download(
request: Request,
csv_download_form: Optional[MasterMainteCsvDlModel] = Depends(MasterMainteCsvDlModel.as_form),
master_mainte_service: MasterMainteService = Depends(get_service(MasterMainteService)),
batch_status_service: BatchStatusService = Depends(get_service(BatchStatusService))
):
session: UserSession = request.session
# マスタメンテメニューへのアクセス権がない場合、ログアウトさせる
if session.master_mainte_flg != '1':
raise HTTPException(status_code=status.HTTP_403_FORBIDDEN)
# バッチ処理中の場合、ログアウトさせる
if batch_status_service.is_batch_processing():
raise HTTPException(status_code=status.HTTP_403_FORBIDDEN,
detail=constants.LOGOUT_REASON_BATCH_PROCESSING_FOR_MAINTE)
# dump処理中の場合、ログアウトさせる
if batch_status_service.is_dump_processing():
raise HTTPException(status_code=status.HTTP_403_FORBIDDEN, detail=constants.LOGOUT_REASON_BACKUP_PROCESSING)
search_result_df, _ = _search_emp_chg_inst_data(master_mainte_service, csv_download_form)
download_file_url = ''
if search_result_df.size > 0:
extract_df = _extract_output_df(search_result_df)
# ファイル名に使用するタイムスタンプを初期化しておく
current_timestamp = datetime.now()
download_file_name = f'Result_{session.user_id}_{current_timestamp:%Y%m%d%H%M%S%f}.csv'
# ファイルを書き出し(CSV)
local_file_path = _write_emp_chg_inst_data_to_file(master_mainte_service, extract_df, download_file_name)
# ローカルファイルからS3にアップロードし、ダウンロード用URLを取得する
try:
master_mainte_service.upload_emp_chg_inst_data_file(local_file_path)
download_file_url = master_mainte_service.generate_download_file_url(local_file_path)
except Exception as e:
logger.exception(f'S3 アクセスエラー{e}')
raise HTTPException(
status_code=status.HTTP_500_INTERNAL_SERVER_ERROR,
detail={'error': 'aws_error', 'message': e.args}
)
if csv_download_form.select_table == 'dummy':
result_msg = f'ダミーテーブルのデータ{search_result_df.size}件をCSVファイルに出力しました'
else:
result_msg = f'本番テーブルのデータ{search_result_df.size}件をCSVファイルに出力しました'
else:
result_msg = '該当データが存在しないためCSVファイルを出力しませんでした'
# 画面表示用のモデル
mainte_csv_dl = InstEmpCsvDownloadViewModel(
is_search=True,
ta_cd=csv_download_form.ta_cd,
inst_cd=csv_download_form.inst_cd,
emp_cd=csv_download_form.emp_cd,
apply_date=csv_download_form.apply_date,
start_date_from=csv_download_form.start_date_from,
start_date_to=csv_download_form.start_date_to,
end_date_from=csv_download_form.end_date_from,
end_date_to=csv_download_form.end_date_to,
create_date_from=csv_download_form.create_date_from,
create_date_to=csv_download_form.create_date_to,
update_date_from=csv_download_form.update_date_from,
update_date_to=csv_download_form.update_date_to,
select_table=csv_download_form.select_table,
data_count=search_result_df.size,
download_file_url=download_file_url,
file_name=constants.MENTE_CSV_DOWNLOAD_FILE_NAME,
result_msg=result_msg
)
# セッション書き換え
session.update(
actions=[
UserSession.last_access_time.set(UserSession.new_last_access_time()),
UserSession.record_expiration_time.set(UserSession.new_record_expiration_time()),
]
)
set_session(session)
templates_response = templates.TemplateResponse(
'instEmpCsvDL.html',
{
'request': request,
'mainte_csv_dl': mainte_csv_dl
},
headers={'session_key': session.session_key}
)
@ -275,3 +374,34 @@ def table_override_view(
headers={'session_key': session.session_key}
)
return templates_response
def _search_emp_chg_inst_data(master_mainte_service: MasterMainteService,
csv_download_form: MasterMainteCsvDlModel) -> pd.DataFrame:
try:
csv_download_form.unescape()
# 施設担当者データを検索
search_result_df, query = master_mainte_service.search_download_emp_chg_inst_data(csv_download_form)
except DBException as e:
raise HTTPException(
status_code=status.HTTP_500_INTERNAL_SERVER_ERROR,
detail={'error': 'db_error', 'message': e.args}
)
return search_result_df, query
def _extract_output_df(search_result_df: pd.DataFrame) -> pd.DataFrame:
return search_result_df[constants.MENTE_CSV_DOWNLOAD_EXTRACT_COLUMNS]
def _write_emp_chg_inst_data_to_file(
master_mainte_service: MasterMainteService,
df: pd.DataFrame,
download_file_name: str
) -> str:
logger.info('CSVファイルを出力する')
local_file_path = master_mainte_service.write_csv_file(
df, header=constants.MENTE_CSV_DOWNLOAD_HEADER, download_file_name=download_file_name)
return local_file_path

View File

@ -203,6 +203,8 @@ class MasterMainteNewInstEmpCSVItem(MasterMainteCSVItem):
bu_master_repository,
emp_chginst_repository
)
# get_csv_value() indexerrorでキャッチするメソッドを追加する
self.inst_cd = self.csv_row[constants.CSV_NEW_INST_CD_COL_NO]
self.inst_name = self.csv_row[constants.CSV_NEW_INST_NAME_COL_NO]
self.ta_cd = self.csv_row[constants.CSV_NEW_TA_CD_COL_NO]
@ -324,6 +326,8 @@ class MasterMainteChangeInstEmpCSVItem(MasterMainteCSVItem):
bu_master_repository,
emp_chginst_repository
)
# self.bu_cd = get_csv_value(constants.CSV_CHANGE_BU_CD_COL_NO) ← IndexErrorでtry catch
self.bu_cd = self.csv_row[constants.CSV_CHANGE_BU_CD_COL_NO]
self.bu_name = self.csv_row[constants.CSV_CHANGE_BU_NAME_COL_NO]
self.org_cd = self.csv_row[constants.CSV_CHANGE_ORG_CD_COL_NO]

View File

@ -0,0 +1,169 @@
from typing import Optional
from fastapi import Form
from src.util.sanitize import sanitize
from src.model.request.request_base_model import RequestBaseModel
from src.util.string_util import is_not_empty
@sanitize
class MasterMainteCsvDlModel(RequestBaseModel):
ta_cd: Optional[str]
adapt_ta_cd: Optional[str]
inst_cd: Optional[str]
adapt_inst_cd: Optional[str]
emp_cd: Optional[str]
adapt_emp_cd: Optional[str]
apply_date: Optional[str]
adapt_apply_date: Optional[str]
start_date_from: Optional[str]
adapt_start_date_from: Optional[str]
start_date_to: Optional[str]
adapt_start_date_to: Optional[str]
end_date_from: Optional[str]
adapt_end_date_from: Optional[str]
end_date_to: Optional[str]
adapt_end_date_to: Optional[str]
select_table: Optional[str]
create_date_from: Optional[str]
adapt_create_date_from: Optional[str]
create_date_to: Optional[str]
adapt_create_date_to: Optional[str]
update_date_from: Optional[str]
adapt_update_date_from: Optional[str]
update_date_to: Optional[str]
adapt_update_date_to: Optional[str]
@classmethod
def as_form(
cls,
ctrl_ta_cd: Optional[str] = Form(None),
ctrl_inst_cd: Optional[str] = Form(None),
ctrl_emp_cd: Optional[str] = Form(None),
ctrl_apply_date: Optional[str] = Form(None),
ctrl_start_date_from: Optional[str] = Form(None),
ctrl_start_date_to: Optional[str] = Form(None),
ctrl_end_date_from: Optional[str] = Form(None),
ctrl_end_date_to: Optional[str] = Form(None),
radio_select_table: Optional[str] = Form(None),
ctrl_create_date_from: Optional[str] = Form(None),
ctrl_create_date_to: Optional[str] = Form(None),
ctrl_update_date_from: Optional[str] = Form(None),
ctrl_update_date_to: Optional[str] = Form(None)
):
return cls.__convert_request_param(
cls,
ctrl_ta_cd,
ctrl_inst_cd,
ctrl_emp_cd,
ctrl_apply_date,
ctrl_start_date_from,
ctrl_start_date_to,
ctrl_end_date_from,
ctrl_end_date_to,
radio_select_table,
ctrl_create_date_from,
ctrl_create_date_to,
ctrl_update_date_from,
ctrl_update_date_to
)
def __convert_request_param(
cls,
ctrl_ta_cd: str,
ctrl_inst_cd: str,
ctrl_emp_cd: str,
ctrl_apply_date: str,
ctrl_start_date_from: str,
ctrl_start_date_to: str,
ctrl_end_date_from: str,
ctrl_end_date_to: str,
radio_select_table: str,
ctrl_create_date_from: str,
ctrl_create_date_to: str,
ctrl_update_date_from: str,
ctrl_update_date_to: str
):
ctrl_ta_cd = ctrl_ta_cd if is_not_empty(ctrl_ta_cd) else ''
ctrl_inst_cd = ctrl_inst_cd if is_not_empty(ctrl_inst_cd) else ''
ctrl_emp_cd = ctrl_emp_cd if is_not_empty(ctrl_emp_cd) else ''
adapt_apply_date = ''
if is_not_empty(ctrl_apply_date):
adapt_apply_date = ctrl_apply_date.replace('/', '')
else:
ctrl_apply_date = ''
adapt_start_date_from = ''
adapt_start_date_to = ''
if is_not_empty(ctrl_start_date_from):
adapt_start_date_from = ctrl_start_date_from.replace('/', '')
else:
ctrl_start_date_from = ''
if is_not_empty(ctrl_start_date_to):
adapt_start_date_to = ctrl_start_date_to.replace('/', '')
else:
ctrl_start_date_to = ''
adapt_end_date_from = ''
adapt_end_date_to = ''
if is_not_empty(ctrl_end_date_from):
adapt_end_date_from = ctrl_end_date_from.replace('/', '')
else:
ctrl_end_date_from = ''
if is_not_empty(ctrl_end_date_to):
adapt_end_date_to = ctrl_end_date_to.replace('/', '')
else:
ctrl_end_date_to = ''
adapt_create_date_from = ''
adapt_create_date_to = ''
if is_not_empty(ctrl_create_date_from):
adapt_create_date_from = ctrl_create_date_from.replace('/', '')
else:
ctrl_create_date_from = ''
if is_not_empty(ctrl_create_date_to):
adapt_create_date_to = ctrl_create_date_to.replace('/', '')
else:
ctrl_create_date_to = ''
adapt_update_date_from = ''
adapt_update_date_to = ''
if is_not_empty(ctrl_update_date_from):
adapt_update_date_from = ctrl_update_date_from.replace('/', '')
else:
ctrl_update_date_from = ''
if is_not_empty(ctrl_update_date_to):
adapt_update_date_to = ctrl_update_date_to.replace('/', '')
else:
ctrl_update_date_to = ''
return cls(
ta_cd=ctrl_ta_cd,
adapt_ta_cd=ctrl_ta_cd,
inst_cd=ctrl_inst_cd,
adapt_inst_cd=ctrl_inst_cd,
emp_cd=ctrl_emp_cd,
adapt_emp_cd=ctrl_emp_cd,
apply_date=ctrl_apply_date,
adapt_apply_date=adapt_apply_date,
start_date_from=ctrl_start_date_from,
adapt_start_date_from=adapt_start_date_from,
start_date_to=ctrl_start_date_to,
adapt_start_date_to=adapt_start_date_to,
select_table=radio_select_table,
end_date_from=ctrl_end_date_from,
adapt_end_date_from=adapt_end_date_from,
end_date_to=ctrl_end_date_to,
adapt_end_date_to=adapt_end_date_to,
create_date_from=ctrl_create_date_from,
adapt_create_date_from=adapt_create_date_from,
create_date_to=ctrl_create_date_to,
adapt_create_date_to=adapt_create_date_to,
update_date_from=ctrl_update_date_from,
adapt_update_date_from=adapt_update_date_from,
update_date_to=ctrl_update_date_to,
adapt_update_date_to=adapt_update_date_to
)

View File

@ -21,7 +21,7 @@ class MasterMainteCsvUpModel(RequestBaseModel):
ctrl_csv_file: UploadFile = Form(None),
ctrl_select_function: Optional[str] = Form(None),
ctrl_select_table: Optional[str] = Form(None),
ctrl_json_upload_data: Optional[str] = Form(None),
ctrl_json_upload_data: Optional[str] = Form(None)
):
return cls(
csv_file=ctrl_csv_file,

View File

@ -1,5 +1,28 @@
from pydantic import BaseModel
from typing import Optional
from src.util.string_util import is_not_empty
class InstEmpCsvDownloadViewModel(BaseModel):
subtitle: str = '施設担当者データCSVダウンロード'
is_search: Optional[bool] = False
ta_cd: Optional[str] = ''
inst_cd: Optional[str] = ''
emp_cd: Optional[str] = ''
apply_date: Optional[str] = ''
start_date_from: Optional[str] = ''
start_date_to: Optional[str] = ''
end_date_from: Optional[str] = ''
end_date_to: Optional[str] = ''
create_date_from: Optional[str] = ''
create_date_to: Optional[str] = ''
update_date_from: Optional[str] = ''
update_date_to: Optional[str] = ''
select_table: Optional[str] = ''
data_count: Optional[int] = 0
result_msg: Optional[str] = ''
download_file_url: Optional[str] = ''
file_name: Optional[str] = ''
def is_select_table_empty(self):
return not is_not_empty(self.select_table)

View File

@ -1,5 +1,9 @@
from src.repositories.base_repository import BaseRepository
from src.db.sql_condition import SQLCondition
from src.db import sql_condition as condition
from src.model.db.master_mente_count import MasterMenteCountModel
from src.model.request.master_mainte_csvdl import MasterMainteCsvDlModel
from src.util.string_util import is_not_empty
from src.logging.get_logger import get_logger
logger = get_logger('従業員担当施設マスタ')
@ -153,3 +157,126 @@ class EmpChgInstRepository(BaseRepository):
raise e
finally:
self._database.disconnect()
FETCH_SQL = """\
SELECT DISTINCT
eci.inst_cd AS inst_cd,
mi.inst_name AS inst_name,
eci.ta_cd AS ta_cd,
eci.emp_cd AS emp_cd,
CONCAT(emp.emp_name_family, " ", emp.emp_name_first) AS emp_name_full,
eci.bu_cd AS bu_cd,
bu.bu_name AS bu_name,
eci.start_date AS start_date,
eci.end_date AS end_date,
eci.creater AS creater,
eci.create_date AS create_date,
eci.updater AS updater,
eci.update_date AS update_date
FROM
{table_name} AS eci
LEFT JOIN mst_inst AS mi
ON eci.inst_cd = mi.inst_cd
LEFT JOIN emp
ON eci.emp_cd = emp.emp_cd
LEFT JOIN bu
ON eci.bu_cd = bu.bu_cd
WHERE
{where_clause}
"""
def fetch_as_data_frame(self, table_name: str, parameter: MasterMainteCsvDlModel):
try:
self._database.connect()
logger.debug('DB参照実行')
where_clause = self.__build_condition(parameter)
query = self.FETCH_SQL.format(table_name=table_name, where_clause=where_clause)
logger.debug(f'SQL: {query}')
df = self._to_data_frame(query, parameter)
logger.debug(f'count= {len(df.index)}')
# ログ出力のため、クエリも返却
return df, query
except Exception as e:
logger.exception(f"DB Error : Exception={e.args}")
raise e
finally:
self._database.disconnect()
def __build_condition(self, parameter: MasterMainteCsvDlModel):
where_clauses: list[SQLCondition] = []
# 領域コードが入力されていた場合
if is_not_empty(parameter.ta_cd):
parameter.adapt_ta_cd = f'%{parameter.ta_cd}%'
where_clauses.append(SQLCondition('eci.ta_cd', condition.LIKE, 'adapt_ta_cd'))
# 施設コードが入力されていた場合
if is_not_empty(parameter.inst_cd):
parameter.adapt_inst_cd = f'%{parameter.inst_cd}%'
where_clauses.append(SQLCondition('eci.inst_cd', condition.LIKE, 'adapt_inst_cd'))
# MUIDが入力されていた場合
if is_not_empty(parameter.emp_cd):
parameter.adapt_emp_cd = f'%{parameter.emp_cd}%'
where_clauses.append(SQLCondition('eci.emp_cd', condition.LIKE, 'adapt_emp_cd'))
# 適用期間内が入力されていた場合
if is_not_empty(parameter.adapt_apply_date):
where_clauses.append(SQLCondition('eci.START_DATE',
condition.LE,
'adapt_apply_date'))
where_clauses.append(SQLCondition('eci.END_DATE',
condition.GE,
'adapt_apply_date'))
# 適用開始日FROMが入力されていた場合
if is_not_empty(parameter.adapt_start_date_from):
where_clauses.append(SQLCondition('eci.START_DATE',
condition.GE,
'adapt_start_date_from'))
# 適用開始日TOが入力されていた場合
if is_not_empty(parameter.adapt_start_date_to):
where_clauses.append(SQLCondition('eci.START_DATE',
condition.LE,
'adapt_start_date_to'))
# 適用終了日FROMが入力されていた場合
if is_not_empty(parameter.adapt_end_date_from):
where_clauses.append(SQLCondition('eci.END_DATE',
condition.GE,
'adapt_end_date_from'))
# 適用終了日TOが入力されていた場合
if is_not_empty(parameter.adapt_end_date_to):
where_clauses.append(SQLCondition('eci.END_DATE',
condition.LE,
'adapt_end_date_to'))
# データ作成日FROMが入力されていた場合
if is_not_empty(parameter.adapt_create_date_from):
where_clauses.append(SQLCondition('eci.CREATE_DATE',
condition.GE,
'adapt_create_date_from'))
# データ作成日TOが入力されていた場合
if is_not_empty(parameter.adapt_create_date_to):
where_clauses.append(SQLCondition('eci.CREATE_DATE',
condition.LE,
'adapt_create_date_to'))
# データ作成日FROMが入力されていた場合
if is_not_empty(parameter.adapt_update_date_from):
where_clauses.append(SQLCondition('eci.UPDATE_DATE',
condition.GE,
'adapt_update_date_from'))
# データ作成日TOが入力されていた場合
if is_not_empty(parameter.adapt_update_date_to):
where_clauses.append(SQLCondition('eci.UPDATE_DATE',
condition.LE,
'adapt_update_date_to'))
where_clauses_str = ' AND '.join([condition.apply() for condition in where_clauses])
logger.debug(f'条件設定終了:{where_clauses_str}')
return where_clauses_str

View File

@ -1,7 +1,12 @@
import os
import json
import html
import pandas as pd
from io import TextIOWrapper
from src.aws.aws_api_client import AWSAPIClient
from src.aws.s3 import S3Client
from src.repositories.base_repository import BaseRepository
from src.services.base_service import BaseService
from src.model.internal.master_mainte_csv import MasterMainteCSVItems
@ -9,6 +14,7 @@ from src.model.internal.master_mainte_emp_chg import MasterMainteNewEmpChg
from src.model.internal.master_mainte_emp_chg import MasterMainteChangeEmpChg
from src.model.view.inst_emp_csv_upload_view_model import InstEmpCsvUploadViewModel
from src.model.request.master_mainte_csvup import MasterMainteCsvUpModel
from src.model.request.master_mainte_csvdl import MasterMainteCsvDlModel
from src.logging.get_logger import get_logger
from src.model.view.mainte_csv_upload_model import CsvUploadModel
from src.model.view.mainte_csv_error_model import CsvErrorModel
@ -16,7 +22,7 @@ from src.repositories.mst_inst_repository import MstInstRepository
from src.repositories.bu_master_cd_repository import BuMasterRepository
from src.repositories.emp_master_repository import EmpMasterRepository
from src.repositories.emp_chg_inst_repository import EmpChgInstRepository
from src.system_var import constants
from src.system_var import constants, environment
logger = get_logger('マスターメンテ')
@ -29,10 +35,15 @@ class MasterMainteService(BaseService):
'emp_chginst_repository': EmpChgInstRepository,
}
CLIENTS = {
's3_client': S3Client
}
mst_inst_repository: MstInstRepository
emp_master_repository: EmpMasterRepository
bu_master_repository: BuMasterRepository
emp_chginst_repository: EmpChgInstRepository
s3_client: S3Client
def __init__(self, repositories: dict[str, BaseRepository], clients: dict[str, AWSAPIClient]) -> None:
super().__init__(repositories, clients)
@ -40,6 +51,7 @@ class MasterMainteService(BaseService):
self.emp_master_repository = repositories['emp_master_repository']
self.bu_master_repository = repositories['bu_master_repository']
self.emp_chginst_repository = repositories['emp_chginst_repository']
self.s3_client = clients['s3_client']
def prepare_mainte_csv_up_view(self,
file: TextIOWrapper,
@ -125,6 +137,36 @@ class MasterMainteService(BaseService):
)
return mainte_csv_up
def search_download_emp_chg_inst_data(self, csv_download_form: MasterMainteCsvDlModel):
(table_name, _) = self.__target_table(csv_download_form.select_table)
search_result_df, query = self.emp_chginst_repository.fetch_as_data_frame(table_name, csv_download_form)
return search_result_df, query
def write_csv_file(self, data_frame: pd.DataFrame, header: list[str], download_file_name: str):
# csvに書き込み
output_file_path = os.path.join(constants.MENTE_CSV_TEMPORARY_FILE_DIR_PATH, download_file_name)
# 横長のDataFrameとするため、ヘッダーの加工処理
header_data = {}
for df_column, header_column in zip(data_frame.columns, header):
header_data[df_column] = header_column
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)
return output_file_path
def upload_emp_chg_inst_data_file(self, local_file_path: str) -> None:
bucket_name = environment.MASTER_MAINTENANCE_BUCKET
file_key = f'data/{os.path.basename(local_file_path)}'
self.s3_client.upload_file(local_file_path, bucket_name, file_key)
def generate_download_file_url(self, local_file_path: str) -> str:
bucket_name = environment.MASTER_MAINTENANCE_BUCKET
file_key = f'data/{os.path.basename(local_file_path)}'
return self.s3_client.generate_presigned_url(bucket_name, file_key, constants.MENTE_CSV_DOWNLOAD_FILE_NAME)
def __target_table(self, select_table: str):
if select_table == 'dummy':
table_name = 'src05.emp_chg_inst_wrk'

View File

@ -226,21 +226,7 @@ function checkNumberOnlyForm($this)
// メニューへボタンの関数
// 機能概要:マスターメンテメニュー画面に遷移する
function backToMainteMenu(){
location.href = "/masterMainte/masterMainteMenu.php";
}
// クリアボタンの関数
// 利用条件form名がsearch
// 引数にはクリアしたいinputの数
// 上から順番にクリアされる
function clrMainte(elementNum){
for (var i = 1; i <= elementNum; i++) {
// document.form名[要素名].value="いれたい値";
var elementsName = "textbox_" + i;
document.search[elementsName].value = "";
}
// ボタンの非活性化
formBtDisabled(elementNum);
location.href = "/menu/";
}
// 確認ダイアログ
@ -249,30 +235,6 @@ function confirmDialog(strMesssage) {
return result;
}
// 検索ボタンの活性非活性関数
// 利用条件form名がsearch
// 利用条件2textbox名がtextbox_数字(1から連番)
// 引数にはテキストボックスの数
function formBtDisabled(elementNum){
var validFlg = false;
for (var i = 1; i <= elementNum; i++) {
var elementsName = "textbox_" + i;
if(document.search[elementsName].value.length > 0){
validFlg = true;
break;
}
}
if (validFlg == true) {
$('#csvDL').removeAttr('disabled');
$('#clear').removeAttr('disabled');
}
else {
$('#csvDL').attr('disabled', 'disabled');
$('#clear').attr('disabled', 'disabled');
}
}
function formInsertBtDisabled(){
var validFlg = false;
if(document.getElementById("excelFile").value === ""){

View File

@ -219,3 +219,39 @@ CSV_CHANGE_COL_COUNT = 14 # 施設担当者変更登録CSV
# CSVアップロードテーブル名(マスターメンテ)
CSV_REAL_TABLE_NAME = '本番テーブル'
CSV_CHANGE_TABLE_NAME = 'ダミーテーブル'
MENTE_CSV_TEMPORARY_FILE_DIR_PATH = path.join(path.curdir, 'src', 'data')
MENTE_CSV_DOWNLOAD_EXTRACT_COLUMNS = [
'inst_cd',
'inst_name',
'ta_cd',
'emp_cd',
'emp_name_full',
'bu_cd',
'bu_name',
'start_date',
'end_date',
'creater',
'create_date',
'updater',
'update_date'
]
MENTE_CSV_DOWNLOAD_HEADER = [
'施設コード',
'施設名',
'領域コード',
'MUID',
'担当者名',
'ビジネスユニットコード',
'ビジネスユニット名',
'適用開始日',
'適用終了日',
'作成者',
'作成日',
'更新者',
'更新日'
]
MENTE_CSV_DOWNLOAD_FILE_NAME = 'instEmpData.csv'

View File

@ -11,6 +11,7 @@ COGNITO_CLIENT_SECRET = os.environ['COGNITO_CLIENT_SECRET']
AWS_REGION = os.environ['AWS_REGION']
SESSION_TABLE_NAME = os.environ['SESSION_TABLE_NAME']
BIO_ACCESS_LOG_BUCKET = os.environ['BIO_ACCESS_LOG_BUCKET']
MASTER_MAINTENANCE_BUCKET = os.environ['MASTER_MAINTENANCE_BUCKET']
DB_HOST = os.environ['DB_HOST']
DB_PORT = int(os.environ['DB_PORT'])

View File

@ -4,26 +4,31 @@
{% with subtitle = mainte_csv_dl.subtitle %}
{% include '_header.html' %}
{% endwith %}
<title><!-- <?php echo $instEmpCsvDL ?> --></title>
<meta http-equiv="content-type" content="text/html; charset=utf-8" />
<!-- <?php
// CSVダウンロードと画面の更新を行うために画面表示後CSVダウンロードURLへリダイレクトリダイレクトされるが画面、URLは変わらない
if (isset($_POST['search_bt']) && $_SESSION["dataCnt"] !== 0) {
echo '<meta http-equiv="refresh" content="0; URL=/masterMainte/csvDownload.php" />';
}
?> -->
<link href="/static/css/masterMainte.css" rel="stylesheet" />
<!-- <link rel="stylesheet" href="<?php echo $jqueryUiCssPath ?>">
<script type="text/javascript" src="<?php echo $jqueryJsPath ?>"></script> -->
<!--<script type="text/javascript">
<script type="text/javascript">
controlCount = 12; // 検索フォームの入力ボックスの数
window.onload = function(){
// ボタン、テキストボックス初期化
formBtDisabled(controlCount);
formBtDisabled();
// DatePickerを有効化
enableDatePicker();
// CSV自動ダウンロード処理
{% if mainte_csv_dl.is_search and mainte_csv_dl.data_count > 0 %}
var link_tag = document.createElement("a");
link_tag.Target="_blank";
link_tag.id = "download_url_link";
link_tag.setAttribute("href", "{{mainte_csv_dl.download_file_url | safe}}");
link_tag.setAttribute("type", "hidden");
link_tag.setAttribute("download", "{{mainte_csv_dl.file_name}}");
document.getElementById("notification").appendChild(link_tag);
document.getElementById("download_url_link").click();
document.getElementById("download_url_link").remove();
{% endif %}
};
function Form_Submit_Disp_Dialog(){
var msg = <?php echo $csvDialogMsg;?>;
var msg = 'CSVファイルを出力しますか';
if (confirmDialog(msg)) {
document.getElementById("loading").style.display = "block";
document.getElementById("csvOutputMsg").style.display = "none";
@ -31,147 +36,153 @@
return false;
}
}
</script> -->
</script>
</head>
<body>
<h1>施設担当者データCSVダウンロード</h1>
<!-- タイトルと上部ボタン -->
<h1>
<table class="headerTable">
<tr>
<td class="headerTdLeft"><!-- <?php echo $instEmpCsvDL; ?> --></td>
<td class="headerTdRight"><button class="buttonSize" onclick="backToMainteMenu()">メニューへ</button></td>
<td class="headerTdLeft">施設担当者データCSVダウンロード</td>
<td class="headerTdRight"><input type="button" name="back" value="メニューへ" onclick="backToMainteMenu()"></td>
</tr>
</table>
</h1>
<!-- 検索フォーム -->
<!-- <form name="search" action="<?php echo $instEmpCsvDLPath ?>" method="POST" onsubmit="return Form_Submit_Disp_Dialog()"> -->
<form name="search" action="" method="POST" onsubmit="return Form_Submit_Disp_Dialog()">
<form name="search" action="/masterMainte/download" method="POST" onsubmit="return Form_Submit_Disp_Dialog()">
<table class="searchTable">
<tbody>
<!-- 検索フォーム1行目 -->
<tr>
<!-- 領域コード -->
<td class="searchLabelTd"><!-- <?php echo $taCd ?> --></td>
<td class="searchLabelTd">領域コード:</td>
<td class="searchInputTd">
<!-- <input class="searchTextbox" type="text" name="textbox_1" value="<?php if(isset($_SESSION["textbox_1"])) {
echo $_SESSION["textbox_1"];
} ?>" maxlength='3' onchange="formBtDisabled(controlCount)" oninput="formBtDisabled(controlCount)"> -->
<input class="searchTextbox" type="text" name="ctrl_ta_cd" value="{{mainte_csv_dl.ta_cd | safe}}" maxlength='3'
onchange="formBtDisabled()"
oninput="formBtDisabled()"
>
</td>
<!-- 施設コード -->
<td class="searchLabelTd"><!-- <?php echo $instCd ?> --></td>
<td class="searchLabelTd">施設コード:</td>
<td class="searchInputTd">
<!-- <input class="searchTextbox" type="text" name="textbox_2" value="<?php if(isset($_SESSION["textbox_2"])) {
echo $_SESSION["textbox_2"];
} ?>" maxlength='18' onchange="formBtDisabled(controlCount)" oninput="formBtDisabled(controlCount)"> -->
<input class="searchTextbox" type="text" name="ctrl_inst_cd" value="{{mainte_csv_dl.inst_cd | safe}}" maxlength='18'
onchange="formBtDisabled()"
oninput="formBtDisabled()"
>
</td>
<!-- MUID -->
<td class="searchLabelTd"><!-- <?php echo $muId ?> --></td>
<td class="searchLabelTd">MUID</td>
<td class="searchInputTd">
<!-- <input class="searchTextbox" type="text" name="textbox_3" value="<?php if(isset($_SESSION["textbox_3"])) {
echo $_SESSION["textbox_3"];
} ?>" maxlength='10' onchange="formBtDisabled(controlCount)" oninput="formBtDisabled(controlCount)"> -->
<input class="searchTextbox" type="text" name="ctrl_emp_cd" value="{{mainte_csv_dl.emp_cd | safe}}" maxlength='10'
onchange="formBtDisabled()"
oninput="formBtDisabled()"
>
</td>
</tr>
<!-- 検索フォーム2行目 -->
<tr>
<!-- 適用期間内 -->
<td class="searchLabelTd"><!-- <?php echo $applyDate ?> --></td>
<td class="searchLabelTd">適用期間内:</td>
<td class="searchInputTd">
<!-- <input class="searchTextbox datepicker" type="text" name="textbox_4" value="<?php if(isset($_SESSION["textbox_4"])) {
echo $_SESSION["textbox_4"];
} ?>" maxlength='10' onchange="formBtDisabled(controlCount)" oninput="formBtDisabled(controlCount)"> -->
<input class="searchDateTextbox date_picker" type="text" name="ctrl_apply_date" value="{{mainte_csv_dl.apply_date | safe}}" maxlength='10'
onchange="formBtDisabled()"
oninput="formBtDisabled()"
>
</td>
<td class="searchLabelTd"><!-- <?php echo $startDate ?> --></td>
<td class="searchLabelTd">適用開始日:</td>
<!-- 適用開始日 -->
<td class="searchInputTd">
<!-- <input class="searchDateTextbox datepicker" type="text" name="textbox_5" value="<?php if(isset($_SESSION["textbox_5"])) {
echo $_SESSION["textbox_5"];
} ?>" maxlength='10' onchange="formBtDisabled(controlCount)" oninput="formBtDisabled(controlCount)"> -->
<input class="searchDateTextbox date_picker" type="text" name="ctrl_start_date_from" value="{{mainte_csv_dl.start_date_from | safe}}" maxlength='10'
onchange="formBtDisabled()"
oninput="formBtDisabled()"
>
<!-- <input class="searchDateTextbox datepicker" type="text" name="textbox_6" value="<?php if(isset($_SESSION["textbox_6"])) {
echo $_SESSION["textbox_6"];
} ?>" maxlength='10' onchange="formBtDisabled(controlCount)" oninput="formBtDisabled(controlCount)"> -->
<input class="searchDateTextbox date_picker" type="text" name="ctrl_start_date_to" value="{{mainte_csv_dl.start_date_to | safe}}" maxlength='10'
onchange="formBtDisabled()"
oninput="formBtDisabled()"
>
</td>
<!-- 適用終了日 -->
<td class="searchLabelTd"><!-- <?php echo $endDate ?> --></td>
<td class="searchLabelTd">適用終了日:</td>
<td class="searchInputTd">
<!-- <input class="searchDateTextbox datepicker" type="text" name="textbox_7" value="<?php if(isset($_SESSION["textbox_7"])) {
echo $_SESSION["textbox_7"];
} ?>" maxlength='10' onchange="formBtDisabled(controlCount)" oninput="formBtDisabled(controlCount)"> -->
<input class="searchDateTextbox date_picker" type="text" name="ctrl_end_date_from" value="{{mainte_csv_dl.end_date_from | safe}}" maxlength='10'
onchange="formBtDisabled()"
oninput="formBtDisabled()"
>
<!-- <input class="searchDateTextbox datepicker" type="text" name="textbox_8" value="<?php if(isset($_SESSION["textbox_8"])) {
echo $_SESSION["textbox_8"];
} ?>" maxlength='10' onchange="formBtDisabled(controlCount)" oninput="formBtDisabled(controlCount)"> -->
<input class="searchDateTextbox date_picker" type="text" name="ctrl_end_date_to" value="{{mainte_csv_dl.end_date_to | safe}}" maxlength='10'
onchange="formBtDisabled()"
oninput="formBtDisabled()"
>
</td>
</tr>
<!-- 検索フォーム3行目 -->
<tr>
<!-- 対象テーブル -->
<td class="searchLabelTd"><!-- <?php echo $selectTable ?> --></td>
<td class="searchLabelTd">対象テーブル:</td>
<td class="searchInputTd">
<label>
<!--
<input type="radio" name="selectTable" value="dummy" <?php if ($_SESSION['selectTable'] == 'dummy' or empty($_SESSION['selectTable'])) {
echo "checked";
} ?> ><?php echo $dummyTable ?> -->
<label>
<input type="radio" name="radio_select_table" value="dummy"
{{ "checked " if mainte_csv_dl.select_table == 'dummy' or mainte_csv_dl.is_select_table_empty() }}
>ダミーテーブル
</label>
<label>
<!--
<input type="radio" name="selectTable" value="real" <?php if ($_SESSION['selectTable'] == 'real') {
echo "checked";
} ?>><?php echo $realTable ?> -->
<input type="radio" name="radio_select_table" value="real"
{{ "checked " if mainte_csv_dl.select_table == 'real' }}
>本番テーブル
</label>
</td>
<!-- データ作成日 -->
<td class="searchLabelTd"><!-- <?php echo $createDate ?> --></td>
<td class="searchLabelTd">データ作成日:</td>
<td class="search_tb">
<!-- <input class="searchDateTextbox datepicker" type="text" name="textbox_9" value="<?php if(isset($_SESSION["textbox_9"])) {
echo $_SESSION["textbox_9"];
} ?>" maxlength='10' onchange="formBtDisabled(controlCount)" oninput="formBtDisabled(controlCount)"> -->
<input class="searchDateTextbox date_picker" type="text" name="ctrl_create_date_from" value="{{mainte_csv_dl.create_date_from | safe}}" maxlength='10'
onchange="formBtDisabled()"
oninput="formBtDisabled()"
>
<!-- <input class="searchDateTextbox datepicker" type="text" name="textbox_10" value="<?php if(isset($_SESSION["textbox_10"])) {
echo $_SESSION["textbox_10"];
} ?>" maxlength='10' onchange="formBtDisabled(controlCount)" oninput="formBtDisabled(controlCount)"> -->
<input class="searchDateTextbox date_picker" type="text" name="ctrl_create_date_to" value="{{mainte_csv_dl.create_date_to | safe}}" maxlength='10'
onchange="formBtDisabled()"
oninput="formBtDisabled()"
>
</td>
<!-- データ更新日 -->
<td class="searchLabelTd"><?php echo $updateDate ?></td>
<td class="searchLabelTd">データ更新日:</td>
<td class="searchInputTd">
<!-- <input class="searchDateTextbox datepicker" type="text" name="textbox_11" value="<?php if(isset($_SESSION["textbox_11"])) {
echo $_SESSION["textbox_11"];
} ?>" maxlength='10' onchange="formBtDisabled(controlCount)" oninput="formBtDisabled(controlCount)"> -->
<input class="searchDateTextbox date_picker" type="text" name="ctrl_update_date_from" value="{{mainte_csv_dl.update_date_from | safe}}" maxlength='10'
onchange="formBtDisabled()"
oninput="formBtDisabled()"
>
<!-- <input class="searchDateTextbox datepicker" type="text" name="textbox_12" value="<?php if(isset($_SESSION["textbox_12"])) {
echo $_SESSION["textbox_12"];
} ?>" maxlength='10' onchange="formBtDisabled(controlCount)" oninput="formBtDisabled(controlCount)"> -->
<input class="searchDateTextbox date_picker" type="text" name="ctrl_update_date_to" value="{{mainte_csv_dl.update_date_to | safe}}" maxlength='10'
onchange="formBtDisabled()"
oninput="formBtDisabled()"
>
</td>
</tr>
<!-- 検索フォーム4行目 -->
<tr>
<!-- 検索、クリアボタン -->
<td class="searchButtonTd" colspan="6">
<input class="buttonSize" id="clear" type="button" name="clear_bt" value="クリア" onclick="clrMainte(controlCount);">
<input class="buttonSize" id="csvDL" name="search_bt" value="CSV出力" type="submit">
<input class="buttonSize" id="clear" type="button" name="clear_bt" value="クリア" onclick="clr();">
<input class="buttonSize" id="search_bt" name="search_bt" value="CSV出力" type="submit">
</td>
</tr>
</tbody>
</table>
</form>
<p>
<!-- <?php
// メッセージ表示処理
$dispMsg = dispMsgInstEmpCsvDL($_SESSION["dataCnt"]);
echo $dispMsg;
?> -->
<p id="notification">
{% if mainte_csv_dl.is_search %}
{% if mainte_csv_dl.data_count == 0 %}
<div id="csvOutputMsg" class="csvOutputMessage errorColor">{{mainte_csv_dl.result_msg}}</div>
{% else %}
<div id="csvOutputMsg" class="csvOutputMessage">{{mainte_csv_dl.result_msg}}</div>
{% endif %}
{% endif %}
<div id="loading" class="csvOutputMessage" style="display:none;">
<!-- <img src="IMG/LOADING.GIF" class="loadimg"> -->
<p>処理中...<br>しばらくお待ち下さい。</p>
</div>
</p>
</body>
</html>