SQLエラー
This commit is contained in:
parent
6497a0b86d
commit
45c6af090c
@ -73,16 +73,19 @@ def search_doc(
|
||||
# if batch_status_service.is_batch_processing():
|
||||
# raise HTTPException(status_code=status.HTTP_403_FORBIDDEN, detail=constants.LOGOUT_REASON_BATCH_PROCESSING)
|
||||
|
||||
# 生物由来データを検索
|
||||
ultmarc_doctor_data = []
|
||||
# 医師データを検索
|
||||
ultmarc_doctor_data = ultmarc_service.search_doctor_data(ultmarc_doctor_form)
|
||||
|
||||
# 検索項目などのデータを取得
|
||||
ultmarc = ultmarc_service.prepare_ultmarc_doctor_view(session)
|
||||
ultmarc.is_batch_processing = batch_status_service.is_batch_processing()
|
||||
ultmarc.doctor_data = ultmarc_doctor_data
|
||||
ultmarc.form_data = ultmarc_doctor_form
|
||||
|
||||
# bio: BioViewModel = bio_service.prepare_bio_view(session)
|
||||
# bio.bio_data = ultmarc_doctor_data
|
||||
# bio.form_data = bio_form
|
||||
|
||||
# セッション書き換え
|
||||
session.update(
|
||||
actions=[
|
||||
|
||||
@ -4,7 +4,7 @@ class SQLCondition:
|
||||
param: str
|
||||
literal: bool
|
||||
|
||||
def __init__(self, column: str, operator: str, param: str, literal=False) -> None:
|
||||
def __init__(self, column: str, operator: str, param: str, literal=False, like_wildcard=False) -> None:
|
||||
"""
|
||||
Args:
|
||||
column (str): カラム名
|
||||
@ -12,17 +12,22 @@ class SQLCondition:
|
||||
param (str): パラメータ(プレースホルダーかリテラル値か)
|
||||
literal (bool, optional): リテラル値を埋め込むかどうか。
|
||||
画面から渡ってきた値を使うとSQLインジェクションの危険性があるため、固定値で使用すること。
|
||||
like_wildcard (bool, optional): like検索で部分一致検索にするかどうか。
|
||||
"""
|
||||
self.column = column
|
||||
self.operator = operator
|
||||
self.param = param
|
||||
self.literal=literal
|
||||
|
||||
self.literal = literal
|
||||
self.like_wildcard = like_wildcard
|
||||
|
||||
def apply(self):
|
||||
# literalがFalseならプレースホルダー。Trueだったならは固定値。
|
||||
param = f':{self.param}' if self.literal is False else self.param
|
||||
# like_wildcardがTrueならLike検索にする
|
||||
param = f'%{param}%' if self.like_wildcard is False else param
|
||||
return f' {self.column} {self.operator} {param}'
|
||||
|
||||
|
||||
# 定数
|
||||
EQ = '='
|
||||
NE = '<>'
|
||||
@ -32,4 +37,4 @@ GE = '>='
|
||||
LE = '<='
|
||||
LIKE = 'LIKE'
|
||||
IS = 'IS'
|
||||
IS_NOT = 'IS NOT'
|
||||
IS_NOT = 'IS NOT'
|
||||
|
||||
19
ecs/jskult-webapp/src/model/db/ultmarc_doctor.py
Normal file
19
ecs/jskult-webapp/src/model/db/ultmarc_doctor.py
Normal file
@ -0,0 +1,19 @@
|
||||
from typing import Optional
|
||||
|
||||
from src.model.db.base_db_model import BaseDBModel
|
||||
from src.util.sanitize import sanitize
|
||||
|
||||
|
||||
@sanitize
|
||||
class UltmarcDoctorDBModel(BaseDBModel):
|
||||
dcf_pcf_dr_cd: Optional[str]
|
||||
dr_name: Optional[str]
|
||||
form_inst_name_kanji: Optional[str]
|
||||
dcf_dsf_inst_cd: Optional[str]
|
||||
blng_sec_name: Optional[str]
|
||||
trt_course_name: Optional[str]
|
||||
form_post_name: Optional[str]
|
||||
alma: Optional[str]
|
||||
grad_y: Optional[str]
|
||||
prefc_name: Optional[str]
|
||||
blng_sec_cd: Optional[str]
|
||||
@ -6,8 +6,8 @@ from typing import Optional
|
||||
from pydantic import BaseModel
|
||||
|
||||
from src.model.db.prefc_master import PrefcMasterModel
|
||||
from src.model.db.wholesaler_master import WholesalerMasterModel
|
||||
from src.model.request.bio import BioModel
|
||||
# from src.model.db.doctor_view import DoctorViewModel
|
||||
from src.model.request.ultmarc_doctor import UltmarcDoctorModel
|
||||
from src.model.view.bio_disp_model import BisDisplayModel
|
||||
from src.system_var import environment
|
||||
|
||||
@ -16,13 +16,14 @@ class UltmarcDoctorViewModel(BaseModel):
|
||||
subtitle: str = '医師検索一覧'
|
||||
is_batch_processing: Optional[bool]
|
||||
prefc_models: list[PrefcMasterModel]
|
||||
# doctor_models: list[DoctorViewModel]
|
||||
doctor_data: Optional[list[BisDisplayModel]] = []
|
||||
form_data: Optional[BioModel]
|
||||
form_data: Optional[UltmarcDoctorModel]
|
||||
|
||||
def display_wholesaler_names(self):
|
||||
display_names = [
|
||||
f'{whs_model.rec_whs_cd}-{whs_model.rec_whs_sub_cd}:{whs_model.nm}'
|
||||
for whs_model in self.whs_models
|
||||
for whs_model in self.doctor_models
|
||||
]
|
||||
return display_names
|
||||
|
||||
@ -30,13 +31,74 @@ class UltmarcDoctorViewModel(BaseModel):
|
||||
def date_handler(obj):
|
||||
return obj.isoformat() if hasattr(obj, 'isoformat') else obj
|
||||
return json.dumps([model.dict() for model in self.doctor_data], ensure_ascii=False, default=date_handler)
|
||||
# ************************** のま作 **************************
|
||||
|
||||
# def is_selected_whs_name(self, selected_wholesaler):
|
||||
# if not self.is_form_submitted():
|
||||
# return ''
|
||||
# 医師コード
|
||||
def is_input_dcf_pcf_dr_cd(self):
|
||||
if not self.is_form_submitted():
|
||||
return ''
|
||||
return self.form_data.dcf_pcf_dr_cd
|
||||
|
||||
# form_wholesaler_full_name = f'{self.form_data.wholesaler_code}-{self.form_data.wholesaler_sub_code}:{self.form_data.wholesaler_name}'
|
||||
# return self._selected_value(form_wholesaler_full_name, selected_wholesaler)
|
||||
# 氏名(漢字)
|
||||
def is_input_dr_name(self):
|
||||
if not self.is_form_submitted():
|
||||
return ''
|
||||
return self.form_data.dr_name
|
||||
|
||||
# 氏名(かな・カナ)
|
||||
def is_input_dr_name_kana(self):
|
||||
if not self.is_form_submitted():
|
||||
return ''
|
||||
return self.form_data.dr_name_kana
|
||||
|
||||
# 勤務先コード
|
||||
def is_input_dcf_dsf_inst_cd(self):
|
||||
if not self.is_form_submitted():
|
||||
return ''
|
||||
return self.form_data.dcf_dsf_inst_cd
|
||||
|
||||
# 勤務先名(漢字)
|
||||
def is_input_form_inst_name_kanji(self):
|
||||
if not self.is_form_submitted():
|
||||
return ''
|
||||
return self.form_data.form_inst_name_kanji
|
||||
|
||||
# 勤務先名(かな・カナ)
|
||||
def is_input_form_inst_name_kana(self):
|
||||
if not self.is_form_submitted():
|
||||
return ''
|
||||
return self.form_data.form_inst_name_kana
|
||||
|
||||
# 勤務先都道府県
|
||||
def is_selected_prefc_cd(self, selected_prefc_cd):
|
||||
if not self.is_form_submitted():
|
||||
return ''
|
||||
return self._selected_value(self.form_data.prefc_cd, selected_prefc_cd)
|
||||
|
||||
# 所属部科(漢字)
|
||||
def is_input_blng_sec_name(self):
|
||||
if not self.is_form_submitted():
|
||||
return ''
|
||||
return self.form_data.blng_sec_name
|
||||
|
||||
# 診療科目(漢字)
|
||||
def is_input_trt_course_name(self):
|
||||
if not self.is_form_submitted():
|
||||
return ''
|
||||
return self.form_data.trt_course_name
|
||||
|
||||
# 出身大学(漢字)
|
||||
def is_input_alma(self):
|
||||
if not self.is_form_submitted():
|
||||
return ''
|
||||
return self.form_data.alma
|
||||
|
||||
# 卒年
|
||||
def is_grad_y(self):
|
||||
if not self.is_form_submitted():
|
||||
return ''
|
||||
return self.form_data.grad_y
|
||||
# ************************** のま作 **************************
|
||||
|
||||
# def is_selected_org_kbn(self, selected_org_kbn):
|
||||
# if not self.is_form_submitted():
|
||||
@ -67,12 +129,6 @@ class UltmarcDoctorViewModel(BaseModel):
|
||||
|
||||
# return self._selected_value(self.form_data.data_kbn, selected_data_kbn)
|
||||
|
||||
def is_selected_prefc_cd(self, selected_prefc_cd):
|
||||
if not self.is_form_submitted():
|
||||
return ''
|
||||
return ''
|
||||
# return self._selected_value(self.form_data.maker_cd, selected_prefc_cd)
|
||||
|
||||
# def is_input_rev_hsdnymd_srk_from(self):
|
||||
# if not self.is_form_submitted():
|
||||
# return ''
|
||||
|
||||
120
ecs/jskult-webapp/src/repositories/ultmarc_doctor_repository.py
Normal file
120
ecs/jskult-webapp/src/repositories/ultmarc_doctor_repository.py
Normal file
@ -0,0 +1,120 @@
|
||||
from src.model.db.ultmarc_doctor import UltmarcDoctorDBModel
|
||||
from src.repositories.base_repository import BaseRepository
|
||||
from src.db import sql_condition as condition
|
||||
from src.db.sql_condition import SQLCondition
|
||||
from src.model.request.ultmarc_doctor import UltmarcDoctorModel
|
||||
from src.repositories.base_repository import BaseRepository
|
||||
from src.util.string_util import is_not_empty
|
||||
|
||||
|
||||
class UltmarcDoctorRepository(BaseRepository):
|
||||
|
||||
FETCH_SQL = """\
|
||||
SELECT
|
||||
com_dr.dcf_pcf_dr_cd,
|
||||
com_dr.dr_name,
|
||||
com_inst.form_inst_name_kanji,
|
||||
com_inst.dcf_dsf_inst_cd,
|
||||
com_blng_sec.blng_sec_name,
|
||||
com_trt_course.trt_course_name,
|
||||
com_post.form_post_name,
|
||||
com_alma.alma,
|
||||
com_dr.grad_y,
|
||||
mst_prefc.prefc_name,
|
||||
com_dr_wrkplace.blng_sec_cd
|
||||
FROM
|
||||
src05.com_dr
|
||||
LEFT JOIN src05.mst_prefc ON com_dr.prefc_cd = mst_prefc.prefc_cd
|
||||
LEFT JOIN src05.com_dr_wrkplace ON com_dr.dcf_pcf_dr_cd = com_dr_wrkplace.dcf_pcf_dr_cd
|
||||
LEFT JOIN src05.com_inst ON com_dr_wrkplace.dcf_dsf_inst_cd = com_inst.dcf_dsf_inst_cd
|
||||
LEFT JOIN src05.com_blng_sec ON com_dr_wrkplace.blng_sec_cd = com_blng_sec.blng_sec_cd
|
||||
LEFT JOIN src05.com_dr_trt_course ON com_dr.dcf_pcf_dr_cd = com_dr_trt_course.dcf_pcf_dr_cd
|
||||
LEFT JOIN src05.com_trt_course ON com_dr_trt_course.trt_course_cd = com_trt_course.trt_course_cd
|
||||
LEFT JOIN src05.com_post ON com_dr_wrkplace.post_cd = com_post.post_cd
|
||||
LEFT JOIN src05.com_alma ON com_dr.alma_cd = com_alma.alma_cd
|
||||
WHERE
|
||||
{where_clause}
|
||||
ORDER BY
|
||||
com_dr.dcf_pcf_dr_cd,
|
||||
com_dr_wrkplace.dcf_dsf_inst_cd,
|
||||
com_dr_wrkplace.blng_sec_cd,
|
||||
com_dr_trt_course.trt_course_cd
|
||||
\
|
||||
"""
|
||||
|
||||
def fetch_many(self, parameter: UltmarcDoctorModel) -> list[UltmarcDoctorDBModel]:
|
||||
try:
|
||||
self._database.connect()
|
||||
where_clause = self.__build_condition(parameter)
|
||||
query = self.FETCH_SQL.format(where_clause=where_clause)
|
||||
result = self._database.execute_select(query, parameter.dict())
|
||||
models = [UltmarcDoctorDBModel(**r) for r in result]
|
||||
|
||||
return models
|
||||
except Exception as e:
|
||||
# TODO: ファイルへの書き出しはloggerでやる
|
||||
print(f"[ERROR] DB Error : Exception={e.args}")
|
||||
raise e
|
||||
finally:
|
||||
self._database.disconnect()
|
||||
|
||||
def __build_condition(self, parameter: UltmarcDoctorModel):
|
||||
where_clauses: list[SQLCondition] = []
|
||||
|
||||
# 医師コード
|
||||
if is_not_empty(parameter.dcf_pcf_dr_cd):
|
||||
# 必ず部分一致で検索
|
||||
where_clauses.append(SQLCondition('com_dr.dcf_pcf_dr_cd', condition.LIKE,
|
||||
'dcf_pcf_dr_cd', like_wildcard=True))
|
||||
# 氏名(漢字)
|
||||
if is_not_empty(parameter.dr_name):
|
||||
# 必ず部分一致で検索
|
||||
where_clauses.append(SQLCondition('dr_name', condition.LIKE, 'dr_name', like_wildcard=True))
|
||||
# 氏名(かな・カナ)
|
||||
if is_not_empty(parameter.dr_name_kana):
|
||||
# 必ず部分一致で検索
|
||||
where_clauses.append(SQLCondition('dr_name_kana', condition.LIKE, 'dr_name_kana', like_wildcard=True))
|
||||
# 勤務先コード
|
||||
if is_not_empty(parameter.dcf_dsf_inst_cd):
|
||||
# 必ず部分一致で検索
|
||||
where_clauses.append(SQLCondition('com_inst.dcf_dsf_inst_cd',
|
||||
condition.LIKE, 'dcf_dsf_inst_cd', like_wildcard=True))
|
||||
# 勤務先名(漢字)
|
||||
if is_not_empty(parameter.form_inst_name_kanji):
|
||||
# 必ず部分一致で検索
|
||||
where_clauses.append(SQLCondition('form_inst_name_kanji', condition.LIKE,
|
||||
'form_inst_name_kanji', like_wildcard=True))
|
||||
# 勤務先名(かな・カナ)
|
||||
if is_not_empty(parameter.form_inst_name_kana):
|
||||
# 必ず部分一致で検索
|
||||
where_clauses.append(SQLCondition('form_inst_name_kana', condition.LIKE,
|
||||
'form_inst_name_kana', like_wildcard=True))
|
||||
|
||||
# 勤務先都道府県
|
||||
if is_not_empty(parameter.prefc_cd):
|
||||
where_clauses.append(SQLCondition('com_inst.prefc_cd', condition.EQ, 'prefc_cd'))
|
||||
|
||||
# 所属部科(漢字)
|
||||
if is_not_empty(parameter.blng_sec_name):
|
||||
# 必ず部分一致で検索
|
||||
where_clauses.append(SQLCondition('com_blng_sec.blng_sec_name',
|
||||
condition.LIKE, 'blng_sec_name', like_wildcard=True))
|
||||
|
||||
# 診療科目(漢字)
|
||||
if is_not_empty(parameter.trt_course_name):
|
||||
# 必ず部分一致で検索
|
||||
where_clauses.append(SQLCondition('trt_course_name', condition.LIKE, 'trt_course_name', like_wildcard=True))
|
||||
|
||||
# 出身大学(漢字)
|
||||
if is_not_empty(parameter.alma):
|
||||
# 必ず部分一致で検索
|
||||
where_clauses.append(SQLCondition('alma', condition.LIKE, 'alma', like_wildcard=True))
|
||||
|
||||
# 卒年
|
||||
if is_not_empty(parameter.grad_y):
|
||||
# 必ず部分一致で検索
|
||||
where_clauses.append(SQLCondition('grad_y', condition.LIKE, 'grad_y', like_wildcard=True))
|
||||
|
||||
where_clauses_str = ' AND '.join([condition.apply() for condition in where_clauses])
|
||||
|
||||
return where_clauses_str
|
||||
@ -7,12 +7,13 @@ import pandas as pd
|
||||
from src.aws.aws_api_client import AWSAPIClient
|
||||
from src.aws.s3 import S3Client
|
||||
from src.model.internal.session import UserSession
|
||||
from src.model.request.bio import BioModel
|
||||
from src.model.request.ultmarc_doctor import UltmarcDoctorModel
|
||||
from src.model.view.bio_disp_model import BisDisplayModel
|
||||
from src.model.view.ultmarc_doctor_view_model import UltmarcDoctorViewModel
|
||||
from src.repositories.base_repository import BaseRepository
|
||||
from src.repositories.bio_sales_view_repository import BioSalesViewRepository
|
||||
from src.repositories.prefc_master_repository import PrefcMasterRepository
|
||||
from src.repositories.ultmarc_doctor_repository import UltmarcDoctorRepository
|
||||
from src.repositories.pharmacy_product_master_repository import \
|
||||
PharmacyProductMasterRepository
|
||||
from src.repositories.wholesaler_master_repository import \
|
||||
@ -23,11 +24,11 @@ from src.system_var import constants, environment
|
||||
|
||||
class UltmarcViewService(BaseService):
|
||||
REPOSITORIES = {
|
||||
'ultmarc_doctor_repository': WholesalerMasterRepository,
|
||||
'ultmarc_doctor_repository': UltmarcDoctorRepository,
|
||||
'prefc_repository': PrefcMasterRepository
|
||||
}
|
||||
|
||||
ultmarc_doctor_repository: WholesalerMasterRepository
|
||||
ultmarc_doctor_repository: UltmarcDoctorRepository
|
||||
prefc_repository: PrefcMasterRepository
|
||||
|
||||
def __init__(self, repositories: dict[str, BaseRepository], clients: dict[str, AWSAPIClient]) -> None:
|
||||
@ -47,65 +48,62 @@ class UltmarcViewService(BaseService):
|
||||
)
|
||||
return ultmarc
|
||||
|
||||
def search_bio_data(self, search_params: BioModel):
|
||||
# 生物由来データを検索
|
||||
bio_sales_view_data = self.bio_sales_repository.fetch_many(parameter=search_params)
|
||||
# 画面表示用に加工
|
||||
display_bio_data: list[BisDisplayModel] = [BisDisplayModel(data) for data in bio_sales_view_data]
|
||||
def search_doctor_data(self, search_params: UltmarcDoctorModel):
|
||||
# 医師データを検索
|
||||
ultmarc_doctor_data = self.ultmarc_doctor_repository.fetch_many(parameter=search_params)
|
||||
return ultmarc_doctor_data
|
||||
|
||||
return display_bio_data
|
||||
# def search_download_bio_data(self, search_params: BioModel):
|
||||
# # 生物由来データをダウンロードするために、DBから検索した結果をデータフレームに変換
|
||||
# bio_sales_data_frame = self.bio_sales_repository.fetch_as_data_frame(parameter=search_params)
|
||||
# return bio_sales_data_frame
|
||||
|
||||
def search_download_bio_data(self, search_params: BioModel):
|
||||
# 生物由来データをダウンロードするために、DBから検索した結果をデータフレームに変換
|
||||
bio_sales_data_frame = self.bio_sales_repository.fetch_as_data_frame(parameter=search_params)
|
||||
return bio_sales_data_frame
|
||||
# def write_excel_file(self, data_frame: pd.DataFrame, user_id: str, timestamp: datetime):
|
||||
# # Excelに書き込み
|
||||
# output_file_path = path.join(constants.BIO_TEMPORARY_FILE_DIR_PATH,
|
||||
# f'Result_{user_id}_{timestamp:%Y%m%d%H%M%S%f}.xlsx')
|
||||
|
||||
def write_excel_file(self, data_frame: pd.DataFrame, user_id: str, timestamp: datetime):
|
||||
# Excelに書き込み
|
||||
output_file_path = path.join(constants.BIO_TEMPORARY_FILE_DIR_PATH,
|
||||
f'Result_{user_id}_{timestamp:%Y%m%d%H%M%S%f}.xlsx')
|
||||
# # テンプレートファイルをコピーして出力ファイルの枠だけを作る
|
||||
# shutil.copyfile(
|
||||
# src=constants.BIO_EXCEL_TEMPLATE_FILE_PATH,
|
||||
# dst=output_file_path
|
||||
# )
|
||||
# # ExcelWriterの追記モード(`mode`='a')でファイルを開く
|
||||
# # `engine``='openpyxlは、追記モードでExcelを開くためのおまじない(xlsxしか動作しないが、こちらが出すものなので問題ナシ)
|
||||
# # 既存シートへの書き込みは、`if_sheet_exists='overlay'を指定する
|
||||
# with pd.ExcelWriter(output_file_path, engine='openpyxl', mode='a', if_sheet_exists='overlay') as writer:
|
||||
# # `sheet_name`引数を省略した場合は、「Sheet1」に書き込む。
|
||||
# # DF内のヘッダと連番を書き込みたくない場合、`header`と`index`をFalseに指定する。
|
||||
# # `startrow`と`startcol`で、Excelの書き込み位置を決定する。省略した場合はA1セルから書く。
|
||||
# data_frame.to_excel(writer, header=False, index=False, startrow=1, startcol=0)
|
||||
|
||||
# テンプレートファイルをコピーして出力ファイルの枠だけを作る
|
||||
shutil.copyfile(
|
||||
src=constants.BIO_EXCEL_TEMPLATE_FILE_PATH,
|
||||
dst=output_file_path
|
||||
)
|
||||
# ExcelWriterの追記モード(`mode`='a')でファイルを開く
|
||||
# `engine``='openpyxlは、追記モードでExcelを開くためのおまじない(xlsxしか動作しないが、こちらが出すものなので問題ナシ)
|
||||
# 既存シートへの書き込みは、`if_sheet_exists='overlay'を指定する
|
||||
with pd.ExcelWriter(output_file_path, engine='openpyxl', mode='a', if_sheet_exists='overlay') as writer:
|
||||
# `sheet_name`引数を省略した場合は、「Sheet1」に書き込む。
|
||||
# DF内のヘッダと連番を書き込みたくない場合、`header`と`index`をFalseに指定する。
|
||||
# `startrow`と`startcol`で、Excelの書き込み位置を決定する。省略した場合はA1セルから書く。
|
||||
data_frame.to_excel(writer, header=False, index=False, startrow=1, startcol=0)
|
||||
# return output_file_path
|
||||
|
||||
return output_file_path
|
||||
# def write_csv_file(self, data_frame: pd.DataFrame, user_id: str, header: list[str], timestamp: datetime):
|
||||
# # csvに書き込み
|
||||
# output_file_path = path.join(constants.BIO_TEMPORARY_FILE_DIR_PATH,
|
||||
# f'Result_{user_id}_{timestamp:%Y%m%d%H%M%S%f}.csv')
|
||||
# # 横長のDataFrameとするため、ヘッダーの加工処理
|
||||
# header_data = {}
|
||||
# for df_column, header_column in zip(data_frame.columns, header):
|
||||
# header_data[df_column] = header_column
|
||||
|
||||
def write_csv_file(self, data_frame: pd.DataFrame, user_id: str, header: list[str], timestamp: datetime):
|
||||
# csvに書き込み
|
||||
output_file_path = path.join(constants.BIO_TEMPORARY_FILE_DIR_PATH,
|
||||
f'Result_{user_id}_{timestamp:%Y%m%d%H%M%S%f}.csv')
|
||||
# 横長の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)
|
||||
|
||||
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
|
||||
|
||||
return output_file_path
|
||||
# def upload_bio_data_file(self, local_file_path: str) -> None:
|
||||
# bucket_name = environment.BIO_ACCESS_LOG_BUCKET
|
||||
# # TODO: フォルダを変える
|
||||
# file_key = f'bio/{path.basename(local_file_path)}'
|
||||
# self.s3_client.upload_file(local_file_path, bucket_name, file_key)
|
||||
|
||||
def upload_bio_data_file(self, local_file_path: str) -> None:
|
||||
bucket_name = environment.BIO_ACCESS_LOG_BUCKET
|
||||
# TODO: フォルダを変える
|
||||
file_key = f'bio/{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, user_id: str, kind: str) -> str:
|
||||
bucket_name = environment.BIO_ACCESS_LOG_BUCKET
|
||||
# TODO: フォルダを変える
|
||||
file_key = f'bio/{path.basename(local_file_path)}'
|
||||
download_filename = f'{user_id}_生物由来卸販売データ.{kind}'
|
||||
return self.s3_client.generate_presigned_url(bucket_name, file_key, download_filename)
|
||||
# def generate_download_file_url(self, local_file_path: str, user_id: str, kind: str) -> str:
|
||||
# bucket_name = environment.BIO_ACCESS_LOG_BUCKET
|
||||
# # TODO: フォルダを変える
|
||||
# file_key = f'bio/{path.basename(local_file_path)}'
|
||||
# download_filename = f'{user_id}_生物由来卸販売データ.{kind}'
|
||||
# return self.s3_client.generate_presigned_url(bucket_name, file_key, download_filename)
|
||||
|
||||
@ -6,9 +6,12 @@
|
||||
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0-alpha1/dist/css/bootstrap.min.css" integrity="sha384-GLhlTQ8iRABdZLl6O3oVMWSktQOp6b7In1Zl3/Jr59b6EGGoI1aFkw7cmDA6j6gD" crossorigin="anonymous">
|
||||
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap-icons@1.10.2/font/bootstrap-icons.css" integrity="sha384-b6lVK+yci+bfDmaY1u0zE8YYJt0TZxLEAFyYSLHId4xoVvsrQu3INevFKo+Xir8e" crossorigin="anonymous">
|
||||
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/flatpickr/dist/flatpickr.min.css">
|
||||
<link rel="stylesheet" href="/static/css/pagenation.css">
|
||||
<link rel="stylesheet" href="/static/css/datepicker.css">
|
||||
<script src="https://code.jquery.com/jquery-3.6.3.min.js" integrity="sha256-pvPw+upLPUjgMXY0G+8O0xUf+/Im1MZjXxxgOcBQBXU=" crossorigin="anonymous"></script>
|
||||
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0-alpha1/dist/js/bootstrap.bundle.min.js" integrity="sha384-w76AqPfDkMBDXo30jS1Sgez6pr3x5MlQ1ZAGC+nuZB+EYdgRZgiwxhTBTkF7CXvN" crossorigin="anonymous"></script>
|
||||
<script src="https://pagination.js.org/dist/2.5.0/pagination.min.js" crossorigin="anonymous"></script>
|
||||
<script src="https://cdn.jsdelivr.net/npm/flatpickr@4.6.13/dist/flatpickr.min.js"></script>
|
||||
<script src="https://cdn.jsdelivr.net/npm/flatpickr/dist/l10n/ja.min.js"></script>
|
||||
<script src="/static/function/businessLogicScript.js"></script>
|
||||
<script src="/static/lib/fixed_midashi.js"></script>
|
||||
|
||||
@ -5,10 +5,7 @@
|
||||
{% include '_header.html' %}
|
||||
{% endwith %}
|
||||
<link rel="stylesheet" href="/static/css/bioStyle.css">
|
||||
<link rel="stylesheet" href="/static/css/pagenation.css">
|
||||
<link rel="stylesheet" href="/static/css/datepicker.css">
|
||||
<script src="/static/lib/fixed_midashi.js"></script>
|
||||
|
||||
|
||||
<script type="text/javascript">
|
||||
window.onload = function() {
|
||||
// 見出し固定初期化
|
||||
|
||||
@ -15,9 +15,6 @@ require_once('/home/nds_dwh/webroot/common/function/getDateBatchJSString.php');
|
||||
{% include '_header.html' %}
|
||||
{% endwith %}
|
||||
<link rel="stylesheet" href="/static/css/ultStyle.css">
|
||||
<link rel="stylesheet" href="/static/css/pagenation.css">
|
||||
<link rel="stylesheet" href="/static/css/datepicker.css">
|
||||
<script src="/static/lib/fixed_midashi.js"></script>
|
||||
|
||||
<!-- <link rel="stylesheet" type="text/css" href="<?php echo $ultCss ?>"> -->
|
||||
<!-- <script type="text/javascript" src="<?php echo $ultJsPath ?>"></script> -->
|
||||
@ -180,14 +177,16 @@ if (!isset($isDBSuccess)) {
|
||||
<tr>
|
||||
<td class="docSearchColumnTd">医師コード:</td>
|
||||
<td class="docSearchTextboxTd">
|
||||
<input class="text docSearchTextbox" style="ime-mode:disabled;" type="text" name="ctrl_dcf_pcf_dr_cd" value="" maxlength='10' oninput="formBtDisabled()">
|
||||
<input class="text docSearchTextbox" style="ime-mode:disabled;" type="text" name="ctrl_dcf_pcf_dr_cd"
|
||||
value="{{ultmarc.is_input_dcf_pcf_dr_cd()}}" maxlength='10' oninput="formBtDisabled()">
|
||||
<!-- <?php if(isset($_SESSION['docTextbox_1'])) {
|
||||
echo $_SESSION['docTextbox_1'];
|
||||
} ?> -->
|
||||
</td>
|
||||
<td class="docSearchColumnTd">氏名(漢字):</td>
|
||||
<td class="docSearchTextboxTd">
|
||||
<input class="text docSearchTextbox" type="text" name="ctrl_dr_name" value="" oninput="formBtDisabled()">
|
||||
<input class="text docSearchTextbox" type="text" name="ctrl_dr_name"
|
||||
value="{{ultmarc.is_input_dr_name()}}" oninput="formBtDisabled()">
|
||||
<!-- <?php if(isset($_SESSION["docTextbox_3"])) {
|
||||
echo $_SESSION["docTextbox_2"];
|
||||
} ?> -->
|
||||
@ -195,7 +194,8 @@ if (!isset($isDBSuccess)) {
|
||||
<!-- アルトマーク課題管理表No.8の修正 氏名(カナ)→氏名(かな・カナ) -->
|
||||
<td class="docSearchColumnTd">氏名(かな・カナ):</td>
|
||||
<td class="docSearchTextboxTd">
|
||||
<input class="text docSearchTextbox" type="text" name="ctrl_dr_name_kana" value="" oninput="formBtDisabled()">
|
||||
<input class="text docSearchTextbox" type="text" name="ctrl_dr_name_kana"
|
||||
value="{{ultmarc.is_input_dr_name_kana()}}" oninput="formBtDisabled()">
|
||||
<!-- <?php if(isset($_SESSION["docTextbox_3"])) {
|
||||
echo $_SESSION["docTextbox_3"];
|
||||
} ?> -->
|
||||
@ -204,14 +204,16 @@ if (!isset($isDBSuccess)) {
|
||||
<tr>
|
||||
<td class="docSearchColumnTd">勤務先コード:</td>
|
||||
<td class="docSearchTextboxTd">
|
||||
<input class="text docSearchTextbox" style="ime-mode:disabled;" type="text" name="ctrl_dcf_dsf_inst_cd" value="" maxlength='11' oninput="formBtDisabled()">
|
||||
<input class="text docSearchTextbox" style="ime-mode:disabled;" type="text" name="ctrl_dcf_dsf_inst_cd"
|
||||
value="{{ultmarc.is_input_dcf_dsf_inst_cd()}}" maxlength='11' oninput="formBtDisabled()">
|
||||
<!-- <?php if(isset($_SESSION['docTextbox_4'])) {
|
||||
echo $_SESSION['docTextbox_4'];
|
||||
} ?> -->
|
||||
</td>
|
||||
<td class="docSearchColumnTd">勤務先名(漢字):</td>
|
||||
<td class="docSearchTextboxTd">
|
||||
<input class="text docSearchTextbox" type="text" name="ctrl_form_inst_name_kanji" value="" oninput="formBtDisabled()">
|
||||
<input class="text docSearchTextbox" type="text" name="ctrl_form_inst_name_kanji"
|
||||
value="{{ultmarc.is_input_form_inst_name_kanji()}}" oninput="formBtDisabled()">
|
||||
<!-- <?php if(isset($_SESSION["docTextbox_5"])) {
|
||||
echo $_SESSION["docTextbox_5"];
|
||||
} ?> -->
|
||||
@ -219,7 +221,8 @@ if (!isset($isDBSuccess)) {
|
||||
<!-- アルトマーク課題管理表No.8の修正 勤務先名(カナ)→勤務先名(かな・カナ) -->
|
||||
<td class="docSearchColumnTd">勤務先名(かな・カナ):</td>
|
||||
<td class="docSearchTextboxTd">
|
||||
<input class="text docSearchTextbox" type="text" name="ctrl_form_inst_name_kana" value="" oninput="formBtDisabled()">
|
||||
<input class="text docSearchTextbox" type="text" name="ctrl_form_inst_name_kana"
|
||||
value="{{ultmarc.is_input_form_inst_name_kana()}}" oninput="formBtDisabled()">
|
||||
<!-- <?php if(isset($_SESSION["docTextbox_6"])) {
|
||||
echo $_SESSION["docTextbox_6"];
|
||||
} ?> -->
|
||||
@ -252,14 +255,16 @@ if (!isset($isDBSuccess)) {
|
||||
<!-- アルトマーク課題管理表No.2の追加 End -->
|
||||
<td class="docSearchColumnTd">所属部科(漢字):</td>
|
||||
<td class="docSearchTextboxTd">
|
||||
<input class="text docSearchTextbox" type="text" name="ctrl_blng_sec_name" value="" oninput="formBtDisabled()">
|
||||
<input class="text docSearchTextbox" type="text" name="ctrl_blng_sec_name"
|
||||
value="{{ultmarc.is_input_blng_sec_name()}}" oninput="formBtDisabled()">
|
||||
<!-- <?php if(isset($_SESSION["docTextbox_7"])) {
|
||||
echo $_SESSION["docTextbox_7"];
|
||||
} ?> -->
|
||||
</td>
|
||||
<td class="docSearchColumnTd">診療科目(漢字):</td>
|
||||
<td class="docSearchTextboxTd">
|
||||
<input class="text docSearchTextbox" type="text" name="ctrl_trt_course_name" value="" oninput="formBtDisabled()">
|
||||
<input class="text docSearchTextbox" type="text" name="ctrl_trt_course_name"
|
||||
value="{{ultmarc.is_input_trt_course_name()}}" oninput="formBtDisabled()">
|
||||
<!-- <?php if(isset($_SESSION["docTextbox_8"])) {
|
||||
echo $_SESSION["docTextbox_8"];
|
||||
} ?> -->
|
||||
@ -268,13 +273,15 @@ if (!isset($isDBSuccess)) {
|
||||
<tr>
|
||||
<td class="docSearchColumnTd">出身大学(漢字):</td>
|
||||
<td class="docSearchTextboxTd">
|
||||
<input class="text docSearchTextbox" type="text" name="ctrl_alma" value="" oninput="formBtDisabled()">
|
||||
<input class="text docSearchTextbox" type="text" name="ctrl_alma"
|
||||
value="{{ultmarc.is_input_alma()}}" oninput="formBtDisabled()">
|
||||
<!-- <?php if(isset($_SESSION["docTextbox_9"])) {
|
||||
echo $_SESSION["docTextbox_9"];
|
||||
} ?> -->
|
||||
</td>
|
||||
<td class="docSearchColumnTd">卒年:</td>
|
||||
<td class="docSearchTextboxTd"><input class="text docSearchTextbox" style="ime-mode:disabled;" type="text" name="ctrl_grad_y" value="" maxlength='4' oninput="formBtDisabled()"></td>
|
||||
<td class="docSearchTextboxTd"><input class="text docSearchTextbox" style="ime-mode:disabled;" type="text" name="ctrl_grad_y"
|
||||
value="" maxlength='4' oninput="formBtDisabled()"></td>
|
||||
<!-- <?php if(isset($_SESSION["docTextbox_10"])) {
|
||||
echo $_SESSION["docTextbox_10"];
|
||||
} ?> -->
|
||||
@ -672,7 +679,7 @@ if (!isset($isDBSuccess)) {
|
||||
$(function() {
|
||||
// スピナー出さない場合は以下、エスケープせず埋め込む
|
||||
// {% autoescape False%}
|
||||
let searchResultString = '{}'
|
||||
let searchResultString = '{{ultmarc.ultmarc_data_json_str()}}'
|
||||
// {% endautoescape%}
|
||||
const searchResultData = JSON.parse(searchResultString)
|
||||
if (searchResultData.length == 0) {
|
||||
@ -699,43 +706,17 @@ if (!isset($isDBSuccess)) {
|
||||
|
||||
function pagination_content(datas) {
|
||||
const display_keys = [
|
||||
'slip_org_kbn',
|
||||
'slip_mgt_no',
|
||||
'rec_ymd',
|
||||
'rec_whs_cd',
|
||||
'rec_whs_sub_cd',
|
||||
'whs_nm',
|
||||
'rec_whs_org_cd',
|
||||
'rec_urag_no',
|
||||
'rev_hsdnymd_srk',
|
||||
'rec_tran_kbn',
|
||||
'tran_kbn_nm',
|
||||
'mkr_cd',
|
||||
'rec_comm_cd',
|
||||
'comm_nm',
|
||||
'whs_rep_comm_nm',
|
||||
'nnsk_cd',
|
||||
'rec_nnskfcl_nm',
|
||||
'whs_rep_nnskfcl_nm',
|
||||
'rec_nnsk_fcl_addr',
|
||||
'whs_rep_nnsk_fcl_addr',
|
||||
'rec_lot_num',
|
||||
'amt_fugo',
|
||||
'expr_dt',
|
||||
'data_kbn',
|
||||
'lot_no_err_flg',
|
||||
'bef_slip_mgt_no',
|
||||
'ins_usr',
|
||||
'ins_dt',
|
||||
'inst_cd',
|
||||
'inst_name_form',
|
||||
'address',
|
||||
'tel_no',
|
||||
'v_whs_cd',
|
||||
'v_whsorg_cd',
|
||||
'whs_org_nm',
|
||||
'v_tran_cd',
|
||||
'iko_flg',
|
||||
'dcf_pcf_dr_cd',
|
||||
'dr_name',
|
||||
'form_inst_name_kanji',
|
||||
'dcf_dsf_inst_cd',
|
||||
'blng_sec_name',
|
||||
'trt_course_name',
|
||||
'form_post_name',
|
||||
'alma',
|
||||
'grad_y',
|
||||
'prefc_name',
|
||||
'blng_sec_cd'
|
||||
];
|
||||
const tableRow = document.createElement('tr')
|
||||
return datas.map(function (data) {
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user