仮完成

This commit is contained in:
野間 2023-07-18 11:37:22 +09:00
parent 3a03262908
commit d615b3bca2
8 changed files with 182 additions and 110 deletions

View File

@ -61,8 +61,7 @@ async def download_bio_data(
return {'status': 'ok', 'download_url': None}
# ファイルに打ち出すカラムを抽出
# TODO: SQLクエリを修正するため、この処理は不要になる
extract_df = _extract_output_df(search_result_df)
extract_df = search_result_df[constants.BIO_EXTRACT_COLUMNS]
# ファイルを書き出し(Excel or CSV)
local_file_path = _write_bio_data_to_file(bio_service, download_param, extract_df, download_file_name)
@ -116,27 +115,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,

View File

@ -5,70 +5,120 @@ from src.model.db.base_db_model import BaseDBModel
class BioSalesViewModel(BaseDBModel):
conv_cd: Optional[int]
rec_data: Optional[str]
# conv_cd: Optional[int]
# rec_data: Optional[str]
# rec_whs_cd: Optional[str]
# rec_whs_sub_cd: Optional[str]
# rec_whs_org_cd: Optional[str]
# rec_cust_cd: Optional[str]
# rec_comm_cd: Optional[str]
# rec_tran_kbn: Optional[str]
# rev_hsdnymd_wrk: Optional[str]
# rev_hsdnymd_srk: Optional[str]
# rec_urag_num: Optional[str]
# rec_comm_name: Optional[str]
# rec_nonyu_fcl_name: Optional[str]
# rec_nonyu_fcl_addr: Optional[str]
# rec_lot_num: Optional[str]
# qty: Optional[str]
# rec_ymd: Optional[str]
# sale_data_cat: Optional[str]
# slip_file_name: Optional[str]
# slip_mgt_num: Optional[str]
# row_num: Optional[int]
# hsdn_ymd: Optional[str]
# exec_dt: Optional[str]
# v_tran_cd: Optional[int]
# tran_kbn_name: Optional[str]
# whs_org_cd: Optional[str]
# v_whsorg_cd: Optional[str]
# whs_org_name: Optional[str]
# whs_org_kn: Optional[str]
# v_whs_cd: Optional[int]
# whs_name: Optional[str]
# nonyu_fcl_cd: Optional[str]
# v_inst_cd: Optional[str]
# v_inst_kn: Optional[str]
# v_inst_nm: Optional[str]
# v_inst_addr: Optional[str]
# comm_cd: Optional[str]
# product_name: Optional[str]
# whs_rep_comm_name: Optional[str]
# whs_rep_nonyu_fcl_name: Optional[str]
# whs_rep_nonyu_fcl_addr: Optional[str]
# mkr_inf_1: Optional[str]
# mkr_cd: Optional[str]
# htdnymd_err_kbn: Optional[str]
# prd_exis_kbn: Optional[str]
# fcl_exis_kbn: Optional[str]
# amt: Optional[int]
# slip_org_kbn: Optional[str]
# bef_slip_mgt_num: Optional[str]
# lot_no_err_flg: Optional[str]
# iko_flg: Optional[str]
# kjyo_ym: Optional[str]
# tksnbk_kbn: Optional[str]
# fcl_exec_kbn: Optional[str]
# rec_sts_kbn: Optional[str]
# ins_dt: Optional[datetime]
# ins_usr: Optional[str]
# dcf_inst_cd: Optional[str]
# inst_cd: Optional[str]
# inst_name_form: Optional[str]
# address: Optional[str]
# tel_num: Optional[str]
# data_kbn: Optional[str]
# ser_no: Optional[str]
# lot_num: Optional[str]
# expr_dt: Optional[date]
# amt_fugo: Optional[str]
slip_mgt_num: Optional[str]
conv_cdR: Optional[int]
rec_whs_cd: Optional[str]
rec_whs_sub_cd: Optional[str]
rec_whs_org_cd: Optional[str]
rec_cust_cd: Optional[str]
rec_comm_cd: Optional[str]
rec_tran_kbn: Optional[str]
rev_hsdnymd_wrk: Optional[str]
rev_hsdnymd_srk: Optional[str]
rec_urag_num: Optional[str]
rec_comm_name: Optional[str]
rec_nonyu_fcl_name: Optional[str]
rec_nonyu_fcl_addr: Optional[str]
rec_lot_num: Optional[str]
rec_qty: Optional[str]
rec_ymd: Optional[str]
sale_data_cat: Optional[str]
slip_file_name: Optional[str]
slip_mgt_num: Optional[str]
row_num: Optional[int]
hsdn_ymd: Optional[str]
exec_dt: Optional[str]
v_tran_cd: Optional[int]
tran_kbn_name: Optional[str]
whs_org_cd: Optional[str]
v_whsorg_cd: Optional[str]
v_whsorg_cd: Optional[int]
whs_org_name: Optional[str]
whs_org_kn: Optional[str]
v_whs_cd: Optional[int]
whs_name: Optional[str]
nonyu_fcl_cd: Optional[str]
v_inst_cd: Optional[str]
v_inst_kn: Optional[str]
v_inst_nm: Optional[str]
v_inst_name: Optional[str]
v_inst_addr: Optional[str]
comm_cd: Optional[str]
product_name: Optional[str]
whs_rep_comm_nm: Optional[str]
whs_rep_nnskfcl_nm: Optional[str]
whs_rep_nnsk_fcl_addr: Optional[str]
whs_rep_comm_name: Optional[str]
whs_rep_nonyu_fcl_name: Optional[str]
whs_rep_nonyu_fcl_addr: Optional[str]
mkr_inf_1: Optional[str]
mkr_cd: Optional[str]
htdnymd_err_kbn: Optional[str]
prd_exis_kbn: Optional[str]
fcl_exis_kbn: Optional[str]
amt: Optional[int]
qty: Optional[int]
slip_org_kbn: Optional[str]
bef_slip_mgt_num: Optional[str]
lot_no_err_flg: Optional[str]
iko_flg: Optional[str]
kjyo_ym: Optional[str]
tksnbk_kbn: Optional[str]
fcl_exec_kbn: Optional[str]
rec_sts_kbn: Optional[str]
ins_dt: Optional[datetime]
ins_dt: Optional[str]
ins_usr: Optional[str]
dcf_inst_cd: Optional[str]
dwh_upd_dt: Optional[datetime]
inst_cd: Optional[str]
inst_name_form: Optional[str]
address: Optional[str]
tel_no: Optional[str]
tel_num: Optional[str]
data_kbn: Optional[str]
ser_no: Optional[str]
lot_num: Optional[str]
data_kind: Optional[str]
err_dtl_kind: Optional[str]
expr_dt: Optional[date]
amt_fugo: Optional[str]

View File

@ -1,5 +1,4 @@
from src.model.db.bio_sales_view import BioSalesViewModel
from src.system_var import constants
from src.util.sanitize import sanitize
@ -8,11 +7,6 @@ class BisDisplayModel(BioSalesViewModel):
def __init__(self, param: BioSalesViewModel) -> 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 = ""

View File

@ -55,6 +55,17 @@ class BioViewModel(BaseModel):
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)
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 ''

View File

@ -12,30 +12,65 @@ logger = get_logger('生物由来参照')
class BioSalesViewRepository(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
slip_mgt_num,
conv_cd,
rec_whs_cd,
rec_whs_sub_cd,
rec_whs_org_cd,
rec_comm_cd,
rec_tran_kbn,
rev_hsdnymd_srk,
rec_urag_num,
rec_comm_name,
rec_nonyu_fcl_name,
rec_nonyu_fcl_addr,
rec_lot_num,
rec_ymd,
v_tran_cd,
tran_kbn_name,
whs_org_cd,
v_whsorg_cd,
whs_org_name,
v_whs_cd,
whs_name,
nonyu_fcl_cd,
v_inst_cd,
v_inst_kn,
v_inst_name,
v_inst_addr,
comm_cd,
product_name,
whs_rep_comm_name,
whs_rep_nonyu_fcl_name,
whs_rep_nonyu_fcl_addr,
mkr_inf_1,
mkr_cd,
qty,
slip_org_kbn,
bef_slip_mgt_num,
lot_no_err_flg,
iko_flg,
rec_sts_kbn,
ins_dt,
ins_usr,
dwh_upd_dt,
inst_cd,
inst_name_form,
address,
tel_num,
data_kbn,
data_kind,
err_dtl_kind,
expr_dt
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\
"""

View File

@ -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)

View File

@ -9,7 +9,7 @@ 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',
'data_kind',
'slip_mgt_num',
'rec_ymd',
'rec_whs_cd',
@ -30,10 +30,10 @@ BIO_EXTRACT_COLUMNS = [
'rec_nonyu_fcl_addr',
'whs_rep_nonyu_fcl_addr',
'rec_lot_num',
'amt_fugo',
'qty',
'expr_dt',
'data_kbn',
'lot_num_err_flg',
'err_dtl_kind',
'bef_slip_mgt_num',
'ins_usr',
'ins_dt',

View File

@ -6,15 +6,15 @@
{% endwith %}
<link rel="stylesheet" href="/static/css/bioStyle.css">
<script type="text/javascript">
window.onload = function() {
<script>
$(function(){
// 見出し固定初期化
FixedMidashi.create();
// ボタン、テキストボックス初期化
formBtDisabled();
// DatePickerを有効化
enableDatePicker();
};
});
</script>
</head>
@ -55,13 +55,11 @@
<input type="text" id="shoribi_start" class="date_picker" name="ctrl_rec_ymd_from"
value="{{bio.is_input_rec_ymd_from()}}"
onchange="formBtDisabled()"
onblur="autoModifyDate(this)"
>
<input type="text" id="shoribi_end" class="date_picker" name="ctrl_rec_ymd_to"
value="{{bio.is_input_rec_ymd_to()}}"
onchange="formBtDisabled()"
onblur="autoModifyDate(this)"
>
</td>
</tr>
@ -96,16 +94,14 @@
<tr>
<td>発伝年月日:</td>
<td colspan="3">
<input type="text" id="shoribi_start" class="date_picker" name="ctrl_rev_hsdnymd_srk_from"
<input type="text" id="hsdnymd_start" class="date_picker" name="ctrl_rev_hsdnymd_srk_from"
value="{{bio.is_input_rev_hsdnymd_srk_from()}}"
onchange="formBtDisabled()"
onblur="autoModifyDate(this)"
>
<input type="text" id="shoribi_start" class="date_picker" name="ctrl_rev_hsdnymd_srk_to"
<input type="text" id="hsdnymd_end" class="date_picker" name="ctrl_rev_hsdnymd_srk_to"
value="{{bio.is_input_rev_hsdnymd_srk_to()}}"
onchange="formBtDisabled()"
onblur="autoModifyDate(this)"
>
</td>
<td colspan="2">
@ -186,6 +182,18 @@
{% endif %}
</div>
</form>
<form id="bio_download">
<input type="hidden" name="ctrl_wholesaler" value="{{bio.make_whs_name()}}">
<input type="hidden" name="ctrl_org_kbn" value="{{bio.form_data.slip_org_kbn or ''}}">
<input type="hidden" name="ctrl_rec_ymd_from" value="{{bio.is_input_rec_ymd_from()}}">
<input type="hidden" name="ctrl_rec_ymd_to" value="{{bio.is_input_rec_ymd_to()}}">
<input type="hidden" name="ctrl_rec_lot_num" value="{{bio.is_input_lot_num()}}">
<input type="hidden" name="ctrl_data_kbn" value="{{bio.form_data.data_kbn or ''}}">
<input type="hidden" name="ctrl_maker_cd" value="{{bio.form_data.mkr_cd or ''}}">
<input type="hidden" name="ctrl_rev_hsdnymd_srk_from" value="{{bio.is_input_rev_hsdnymd_srk_from()}}">
<input type="hidden" name="ctrl_rev_hsdnymd_srk_to" value="{{bio.is_input_rev_hsdnymd_srk_to()}}">
<input type="checkbox" name="ikoFlg" value="true" {{bio.is_checked_iko_flg()}} style="display: none;">
</form>
<!-- CSV/Excelダウンロードボタン。ここはajaxでやってる -->
<script type="text/javascript">
@ -193,7 +201,7 @@
$(`#loading`).toggle()
// 検索パラメータを取得
const formData = $('#bio_search').serializeArray()
const formData = $('#bio_download').serializeArray()
// リクエスト用に加工
const searchParams = {}
for (let i = 0; i < formData.length; i++) {
@ -216,22 +224,14 @@
success: function(data) {
try {
if (data.status === 'batch_processing') {
location.href('/logout/?reason=batchProcessing')
location.href='/logout/?reason=batchProcessing';
return
}
if (data.status === 'session_expired') {
location.href('/logout/?reason=session_expired')
location.href='/logout/?reason=session_expired';
return
}
// データが存在しない場合の考慮が必要
/**if (data.download_url === '') {
// 予期せぬエラーが発生した場合
$(`#loading`).toggle();
$(`#modal_${ext}`).modal('toggle');
$(`#ErrorModal_Unexpected`).modal('toggle');
}
*/
// S3の期限付き署名URLがレスポンスされる
window.location.href = data.download_url;
$(`#loading`).toggle();
@ -279,7 +279,7 @@
done(searchResultData)
},
pageNumber: 1, // 初期ページ番号
pageSize: 50, //表示するコンテンツ数
pageSize: 100, //表示するコンテンツ数
pageRange: 2, //選択されているページネーション番号の両隣に表示する個数
ellipsisText: '...', //省略文字
prevText: 'Prev', //「前へ」の文字。エスケープ文字
@ -295,7 +295,7 @@
function pagination_content(datas) {
const display_keys = [
'slip_org_kbn',
'data_kind',
'slip_mgt_num',
'rec_ymd',
'rec_whs_cd',
@ -309,24 +309,24 @@
'mkr_cd',
'rec_comm_cd',
'product_name',
'whs_rep_comm_nm',
'whs_rep_comm_name',
'nonyu_fcl_cd',
'rec_nonyu_fcl_name',
'whs_rep_nnskfcl_nm',
'whs_rep_nonyu_fcl_name',
'rec_nonyu_fcl_addr',
'whs_rep_nnsk_fcl_addr',
'whs_rep_nonyu_fcl_addr',
'rec_lot_num',
'amt_fugo',
'qty',
'expr_dt',
'data_kbn',
'lot_no_err_flg',
'err_dtl_kind',
'bef_slip_mgt_num',
'ins_usr',
'ins_dt',
'inst_cd',
'inst_name_form',
'address',
'tel_no',
'tel_num',
'v_whs_cd',
'v_whsorg_cd',
'whs_org_name',
@ -334,6 +334,7 @@
'iko_flg',
];
return datas.map(function (data) {
console.log(data);
return `
<tr class="result_data">
${display_keys.map((key) =>`<td>${data[key] || ''}</td>`)}