feat: レビュー指摘対応
This commit is contained in:
parent
1bf03393d5
commit
34e5be3e68
@ -1,14 +1,9 @@
|
||||
from io import BytesIO, TextIOWrapper
|
||||
from datetime import datetime
|
||||
from typing import Optional
|
||||
|
||||
import pandas as pd
|
||||
from fastapi import APIRouter, Depends, HTTPException, Request
|
||||
from fastapi.responses import HTMLResponse
|
||||
from starlette import status
|
||||
from src.error.exceptions import DBException
|
||||
|
||||
|
||||
from src.depends.services import get_service
|
||||
from src.logging.get_logger import get_logger
|
||||
from src.model.internal.session import UserSession
|
||||
@ -269,34 +264,12 @@ async def inst_emp_csv_download(
|
||||
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)
|
||||
search_result_df = master_mainte_service.search_emp_chg_inst_data(csv_download_form)
|
||||
|
||||
# ファイル名に使用するタイムスタンプを初期化しておく
|
||||
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ファイルを出力しませんでした'
|
||||
(result_msg, download_file_url) = master_mainte_service.upload_emp_chg_inst_data_file(
|
||||
search_result_df,
|
||||
session.user_id,
|
||||
csv_download_form.select_table)
|
||||
|
||||
# 画面表示用のモデル
|
||||
mainte_csv_dl = InstEmpCsvDownloadViewModel(
|
||||
@ -400,7 +373,7 @@ def table_override_result_view(
|
||||
raise HTTPException(status_code=status.HTTP_403_FORBIDDEN, detail=constants.LOGOUT_REASON_BACKUP_PROCESSING)
|
||||
|
||||
# 画面表示用のモデル
|
||||
table_override = master_mainte_service.prepare_mainte_table_override_view()
|
||||
table_override = master_mainte_service.copy_data_real_to_dummy()
|
||||
|
||||
# セッション書き換え
|
||||
session.update(
|
||||
@ -419,34 +392,3 @@ def table_override_result_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
|
||||
|
||||
@ -26,3 +26,6 @@ class InstEmpCsvDownloadViewModel(BaseModel):
|
||||
|
||||
def is_select_table_empty(self):
|
||||
return not is_not_empty(self.select_table)
|
||||
|
||||
def is_download_file_url_empty(self):
|
||||
return not is_not_empty(self.download_file_url)
|
||||
|
||||
@ -195,7 +195,7 @@ class EmpChgInstRepository(BaseRepository):
|
||||
df = self._to_data_frame(query, parameter)
|
||||
logger.debug(f'count= {len(df.index)}')
|
||||
# ログ出力のため、クエリも返却
|
||||
return df, query
|
||||
return df
|
||||
except Exception as e:
|
||||
logger.exception(f"DB Error : Exception={e.args}")
|
||||
raise e
|
||||
|
||||
@ -4,9 +4,13 @@ import html
|
||||
|
||||
import pandas as pd
|
||||
|
||||
from fastapi import HTTPException
|
||||
from io import TextIOWrapper
|
||||
from src.aws.aws_api_client import AWSAPIClient
|
||||
from src.aws.s3 import S3Client
|
||||
from src.error.exceptions import DBException
|
||||
from starlette import status
|
||||
from datetime import datetime
|
||||
from src.services.base_service import BaseService
|
||||
from src.system_var import constants, environment
|
||||
from src.repositories.base_repository import BaseRepository
|
||||
@ -63,7 +67,7 @@ class MasterMainteService(BaseService):
|
||||
if csv_upload_form.select_table != 'dummy' and csv_upload_form.select_table != 'real':
|
||||
raise Exception(f'登録テーブルの選択値が不正です: {csv_upload_form.select_table}')
|
||||
|
||||
(table_name, _) = self.__target_table(csv_upload_form.select_table)
|
||||
(table_name, _) = self.__choose_target_table(csv_upload_form.select_table)
|
||||
|
||||
csv_items = MasterMainteCSVItems(
|
||||
file,
|
||||
@ -105,7 +109,7 @@ class MasterMainteService(BaseService):
|
||||
user_name: str,
|
||||
csv_upload_form: MasterMainteCsvUpModel) -> InstEmpCsvUploadViewModel:
|
||||
|
||||
(table_name, selected_table_msg) = self.__target_table(csv_upload_form.select_table)
|
||||
(table_name, selected_table_msg) = self.__choose_target_table(csv_upload_form.select_table)
|
||||
|
||||
csv_data_list = json.loads(html.unescape(csv_upload_form.unescape().json_upload_data))
|
||||
|
||||
@ -138,7 +142,7 @@ class MasterMainteService(BaseService):
|
||||
)
|
||||
return mainte_csv_up
|
||||
|
||||
def prepare_mainte_table_override_view(self) -> TableOverrideViewModel:
|
||||
def copy_data_real_to_dummy(self) -> TableOverrideViewModel:
|
||||
try:
|
||||
self.emp_chginst_repository.connect()
|
||||
self.emp_chginst_repository.begin()
|
||||
@ -151,15 +155,29 @@ class MasterMainteService(BaseService):
|
||||
finally:
|
||||
self.emp_chginst_repository.disconnect()
|
||||
|
||||
# コピー完了をマークして画面に返却
|
||||
table_override = TableOverrideViewModel(
|
||||
is_override=True
|
||||
)
|
||||
return table_override
|
||||
|
||||
def search_emp_chg_inst_data(self, csv_download_form: MasterMainteCsvDlModel) -> pd.DataFrame:
|
||||
try:
|
||||
csv_download_form.unescape()
|
||||
# 施設担当者データを検索
|
||||
search_result_df = self.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
|
||||
|
||||
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
|
||||
(table_name, _) = self.__choose_target_table(csv_download_form.select_table)
|
||||
search_result_df = self.emp_chginst_repository.fetch_as_data_frame(table_name, csv_download_form)
|
||||
return search_result_df
|
||||
|
||||
def write_csv_file(self, data_frame: pd.DataFrame, header: list[str], download_file_name: str):
|
||||
# csvに書き込み
|
||||
@ -176,19 +194,52 @@ class MasterMainteService(BaseService):
|
||||
|
||||
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)
|
||||
# アップロード後、ローカルからは削除する
|
||||
self.delete_local_file(local_file_path)
|
||||
def upload_emp_chg_inst_data_file(self, df: pd.DataFrame, user_id: str, select_table: str) -> tuple[str, str]:
|
||||
if df.size == 0:
|
||||
return '該当データが存在しないためCSVファイルを出力しませんでした', ''
|
||||
|
||||
# ファイル名に使用するタイムスタンプを初期化しておく
|
||||
current_timestamp = datetime.now()
|
||||
download_file_name = f'Result_{user_id}_{current_timestamp:%Y%m%d%H%M%S%f}.csv'
|
||||
|
||||
# ファイルを書き出し(CSV)
|
||||
local_file_path = self.__write_emp_chg_inst_data_to_file(df, download_file_name)
|
||||
|
||||
# ローカルファイルからS3にアップロードし、ダウンロード用URLを取得する
|
||||
download_file_url = ''
|
||||
try:
|
||||
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)
|
||||
# アップロード後、ローカルからは削除する
|
||||
self.delete_local_file(local_file_path)
|
||||
download_file_url = self.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 select_table == 'dummy':
|
||||
result_msg = f'ダミーテーブルのデータ{df.size}件をCSVファイルに出力しました'
|
||||
else:
|
||||
result_msg = f'本番テーブルのデータ{df.size}件をCSVファイルに出力しました'
|
||||
|
||||
return result_msg, download_file_url
|
||||
|
||||
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):
|
||||
def __write_emp_chg_inst_data_to_file(self, df: pd.DataFrame, download_file_name: str) -> str:
|
||||
logger.info('CSVファイルを出力する')
|
||||
local_file_path = self.write_csv_file(
|
||||
df, header=constants.MENTE_CSV_DOWNLOAD_HEADER, download_file_name=download_file_name)
|
||||
|
||||
return local_file_path
|
||||
|
||||
def __choose_target_table(self, select_table: str):
|
||||
if select_table == 'dummy':
|
||||
table_name = 'src05.emp_chg_inst_wrk'
|
||||
selected_table_msg = constants.CSV_CHANGE_TABLE_NAME
|
||||
|
||||
@ -176,69 +176,68 @@ function allOn(){
|
||||
// 条件:チェックボックスのクラス名に"selectedページ数"というのがついていること
|
||||
// 条件:ボタンにクラス名 send がついていること
|
||||
function allOff(){
|
||||
$(".selected").prop("checked", false);
|
||||
$(".send").prop('disabled',true);
|
||||
$(".selected").prop("checked", false);
|
||||
$(".send").prop('disabled',true);
|
||||
}
|
||||
|
||||
// 検索結果のところのボタンをチェックが1個でも付いたら押せるようにして、チェックがなければ押せないようにする関数
|
||||
// 条件:チェックボックスのクラス名に"selected"というのがついていること
|
||||
// 条件:ボタンにクラス名 send がついていること
|
||||
function resultBtDisablead(){
|
||||
var cnt1 = $('.checkNum input:checkbox:checked').length;
|
||||
console.log(cnt1);
|
||||
var cnt1 = $('.checkNum input:checkbox:checked').length;
|
||||
console.log(cnt1);
|
||||
if(cnt1 == 0) {
|
||||
$(".send").prop('disabled',true);
|
||||
}
|
||||
else {
|
||||
$(".send").prop('disabled',false);
|
||||
$(".send").prop('disabled',false);
|
||||
}
|
||||
}
|
||||
|
||||
// 数字-以外を許さない入力チェック
|
||||
function checkNumberForm($this)
|
||||
{
|
||||
var str=$this.value;
|
||||
while(str.match(/[^\d\-]/))
|
||||
{
|
||||
str=str.replace(/[^\d\-]/,"");
|
||||
}
|
||||
$this.value=str;
|
||||
var str=$this.value;
|
||||
while(str.match(/[^\d\-]/))
|
||||
{
|
||||
str=str.replace(/[^\d\-]/,"");
|
||||
}
|
||||
$this.value=str;
|
||||
}
|
||||
|
||||
// 数字以外を許さない入力チェック
|
||||
function checkNumberOnlyForm($this)
|
||||
{
|
||||
var str=$this.value;
|
||||
while(str.match(/[^\d]/))
|
||||
{
|
||||
str=str.replace(/[^\d]/,"");
|
||||
}
|
||||
$this.value=str;
|
||||
var str=$this.value;
|
||||
while(str.match(/[^\d]/))
|
||||
{
|
||||
str=str.replace(/[^\d]/,"");
|
||||
}
|
||||
$this.value=str;
|
||||
}
|
||||
|
||||
// メニューへボタンの関数
|
||||
// 機能概要:マスターメンテメニュー画面に遷移する
|
||||
function backToMainteMenu(){
|
||||
location.href = "/menu/";
|
||||
location.href = "/menu/";
|
||||
}
|
||||
|
||||
// 確認ダイアログ
|
||||
function confirmDialog(strMesssage) {
|
||||
var result = confirm(strMesssage);
|
||||
return result;
|
||||
var result = confirm(strMesssage);
|
||||
return result;
|
||||
}
|
||||
|
||||
function formInsertBtDisabled(){
|
||||
var validFlg = false;
|
||||
if(document.getElementById("csvFile").value === ""){
|
||||
validFlg = true;
|
||||
}
|
||||
var validFlg = false;
|
||||
if(document.getElementById("csvFile").value === ""){
|
||||
validFlg = true;
|
||||
}
|
||||
|
||||
if (validFlg == true) {
|
||||
document.getElementById("confirm").disabled = true;
|
||||
}
|
||||
else {
|
||||
document.getElementById("confirm").disabled = false;
|
||||
}
|
||||
if (validFlg == true) {
|
||||
document.getElementById("confirm").disabled = true;
|
||||
}
|
||||
else {
|
||||
document.getElementById("confirm").disabled = false;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -15,7 +15,7 @@
|
||||
// DatePickerを有効化
|
||||
enableDatePicker();
|
||||
// CSV自動ダウンロード処理
|
||||
{% if mainte_csv_dl.is_search and mainte_csv_dl.data_count > 0 %}
|
||||
{% if mainte_csv_dl.is_search and mainte_csv_dl.data_count > 0 and mainte_csv_dl.is_download_file_url_empty == False %}
|
||||
var link_tag = document.createElement("a");
|
||||
link_tag.Target="_blank";
|
||||
link_tag.id = "download_url_link";
|
||||
@ -46,7 +46,7 @@
|
||||
<table class="headerTable">
|
||||
<tr>
|
||||
<td class="headerTdLeft">施設担当者データCSVダウンロード</td>
|
||||
<td class="headerTdRight"><input type="button" name="back" value="メニューへ" onclick="backToMainteMenu()"></td>
|
||||
<td class="headerTdRight"><input type="button" name="back" class="header_buttonSize" value="メニューへ" onclick="backToMainteMenu()"></td>
|
||||
</tr>
|
||||
</table>
|
||||
</h1>
|
||||
|
||||
@ -25,7 +25,7 @@
|
||||
<table class="headerTable">
|
||||
<tr>
|
||||
<td class="headerTdLeft">テーブル上書きコピー</td>
|
||||
<td class="headerTdRight"><input type="button" name="back" value="メニューへ" onclick="backToMainteMenu()"></td>
|
||||
<td class="headerTdRight"><input type="button" name="back" class="header_buttonSize" value="メニューへ" onclick="backToMainteMenu()"></td>
|
||||
</tr>
|
||||
</table>
|
||||
</h1>
|
||||
@ -43,7 +43,7 @@
|
||||
<td></td>
|
||||
<td>
|
||||
<form name="overRide" action="/masterMainte/tableOverride" method="POST" onsubmit="return Form_Submit_Disp_Dialog();">
|
||||
<input type="submit" name="overRide_bt" class="buttonSize" value="データ上書" >
|
||||
<input type="submit" name="overRide_bt" class="header_buttonSize" value="データ上書" >
|
||||
</form>
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user