unnastyle's picture
Update app.py
28e8901 verified
import pandas as pd
import gradio as gr
from datetime import datetime
# ์—‘์…€ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ ํ•จ์ˆ˜
def process_excel_files(member_file, order_file, ์ž‘์„ฑ์ผ์ž):
try:
# ํšŒ์›์ •๋ณด ๋ฐ ์ฃผ๋ฌธ๋‚ด์—ญ ํŒŒ์ผ ์ฝ๊ธฐ
member_df = pd.read_excel(member_file)
order_df = pd.read_excel(order_file)
# ์—ด ์ด๋ฆ„ ๋งคํ•‘
order_df.rename(
columns={
'์ฃผ๋ฌธ์žID': '์•„์ด๋””',
'์ด ๊ฒฐ์ œ๊ธˆ์•ก': '์ด ๊ฒฐ์ œ๊ธˆ์•ก',
'์˜ˆ์น˜๊ธˆ(์ตœ์ข…)': '์˜ˆ์น˜๊ธˆ(์ตœ์ข…)',
'์ด ์ฃผ๋ฌธ๊ธˆ์•ก': '์ฃผ๋ฌธ๊ธˆ์•ก'
},
inplace=True
)
# ์—ด ์ด๋ฆ„ ํ™•์ธ
required_member_columns = ['์•„์ด๋””', '์ด๋ฆ„', '์ƒํ˜ธ', '์‚ฌ์—…์ž๋ฒˆํ˜ธ', '์ด๋ฉ”์ผ']
required_order_columns = ['์ฃผ๋ฌธ๋ฒˆํ˜ธ', '์•„์ด๋””', '์ด ๊ฒฐ์ œ๊ธˆ์•ก', '์˜ˆ์น˜๊ธˆ(์ตœ์ข…)', '์ฃผ๋ฌธ๊ธˆ์•ก']
missing_member_columns = [col for col in required_member_columns if col not in member_df.columns]
missing_order_columns = [col for col in required_order_columns if col not in order_df.columns]
if missing_member_columns:
return f"์—๋Ÿฌ ๋ฐœ์ƒ: 'ํšŒ์›์ •๋ณด ํŒŒ์ผ'์— ๋ˆ„๋ฝ๋œ ์—ด: {missing_member_columns}. ํŒŒ์ผ ์—ด ์ด๋ฆ„: {list(member_df.columns)}"
if missing_order_columns:
return f"์—๋Ÿฌ ๋ฐœ์ƒ: '์ฃผ๋ฌธ๋‚ด์—ญ ํŒŒ์ผ'์— ๋ˆ„๋ฝ๋œ ์—ด: {missing_order_columns}. ํŒŒ์ผ ์—ด ์ด๋ฆ„: {list(order_df.columns)}"
# ์ฃผ๋ฌธ๊ธˆ์•ก ์—ด์— '์ด ๊ฒฐ์ œ๊ธˆ์•ก + ์˜ˆ์น˜๊ธˆ(์ตœ์ข…)' ํ•ฉ๊ณ„๋ฅผ ๊ณ„์‚ฐ
order_df['์ฃผ๋ฌธ๊ธˆ์•ก'] = order_df['์ด ๊ฒฐ์ œ๊ธˆ์•ก'] + order_df['์˜ˆ์น˜๊ธˆ(์ตœ์ข…)']
# ์ฃผ๋ฌธ๋ฒˆํ˜ธ ๊ธฐ์ค€ ์ค‘๋ณต ์ œ๊ฑฐ ๋ฐ ์ฃผ๋ฌธ๊ธˆ์•ก์ด 0์ธ ํ–‰ ์‚ญ์ œ
order_df.drop_duplicates(subset="์ฃผ๋ฌธ๋ฒˆํ˜ธ", inplace=True)
order_df = order_df[order_df['์ฃผ๋ฌธ๊ธˆ์•ก'] != 0]
# ๋™์ผ ์•„์ด๋””์˜ ์ฃผ๋ฌธ๊ธˆ์•ก ํ•ฉ์‚ฐํ•˜์—ฌ ์ฃผ๋ฌธํ•ฉ๊ณ„ ์—ด ์ƒ์„ฑ
order_sum = order_df.groupby("์•„์ด๋””")['์ฃผ๋ฌธ๊ธˆ์•ก'].sum().reset_index()
order_sum.rename(columns={'์ฃผ๋ฌธ๊ธˆ์•ก': '์ฃผ๋ฌธํ•ฉ๊ณ„'}, inplace=True)
order_df = pd.merge(order_df, order_sum, on="์•„์ด๋””", how="left")
# ์•„์ด๋”” ์—ด ๊ธฐ์ค€ ์ค‘๋ณต ์ œ๊ฑฐ (์ฒซ ๋ฒˆ์งธ ํ–‰ ์œ ์ง€)
order_df = order_df.drop_duplicates(subset="์•„์ด๋””", keep="first")
# ํšŒ์›์ •๋ณด์™€ ์ฃผ๋ฌธ๋‚ด์—ญ ๋ณ‘ํ•ฉ (์•„์ด๋”” ๊ธฐ์ค€)
merged_df = pd.merge(order_df, member_df, on="์•„์ด๋””", how="left")
# ์•„์ด๋””๊ฐ€ ๋™์ผํ•œ ํ–‰์—๋งŒ ๊ฐ’ ์ž…๋ ฅ
for idx in order_df.index:
current_id = order_df.loc[idx, '์•„์ด๋””']
matching_row = merged_df[merged_df['์•„์ด๋””'] == current_id]
if not matching_row.empty:
order_df.loc[idx, '์ด๋ฆ„'] = matching_row.iloc[0]['์ด๋ฆ„']
order_df.loc[idx, '์ƒํ˜ธ'] = matching_row.iloc[0]['์ƒํ˜ธ']
order_df.loc[idx, '์‚ฌ์—…์ž๋ฒˆํ˜ธ'] = matching_row.iloc[0]['์‚ฌ์—…์ž๋ฒˆํ˜ธ']
order_df.loc[idx, '์ด๋ฉ”์ผ'] = matching_row.iloc[0]['์ด๋ฉ”์ผ']
# ์ˆ˜์ •๋œ ์ฃผ๋ฌธ๋‚ด์—ญ ํŒŒ์ผ ์ €์žฅ
updated_order_file_path = f"์ฃผ๋ฌธ๋‚ด์—ญ(์ˆ˜์ •)_{datetime.now().strftime('%Y%m%d_%H%M%S')}.xlsx"
order_df.to_excel(updated_order_file_path, index=False, header=['์•„์ด๋””'] + list(order_df.columns[1:]))
# ์ˆ˜์ •๋œ ์ฃผ๋ฌธ๋‚ด์—ญ ํŒŒ์ผ ๋‹ค์‹œ ์ฝ๊ธฐ
updated_order_df = pd.read_excel(updated_order_file_path)
# ๊ฒฐ๊ณผ ์—‘์…€ ์ƒ์„ฑ (์ˆ˜์ •๋œ ์ฃผ๋ฌธ๋‚ด์—ญ ๊ฐ’์„ ๊ธฐ๋ฐ˜์œผ๋กœ ์ƒ์„ฑ)
result = pd.DataFrame()
result['A์—ด'] = ['01'] * len(updated_order_df)
result['B์—ด'] = [์ž‘์„ฑ์ผ์ž] * len(updated_order_df)
result['C์—ด'] = updated_order_df['์‚ฌ์—…์ž๋ฒˆํ˜ธ']
result['D์—ด'] = [''] * len(updated_order_df)
result['E์—ด'] = updated_order_df['์ƒํ˜ธ']
result['F์—ด'] = updated_order_df['์ด๋ฆ„']
result['G์—ด'] = [''] * len(updated_order_df)
result['H์—ด'] = [''] * len(updated_order_df)
result['I์—ด'] = [''] * len(updated_order_df)
result['J์—ด'] = updated_order_df['์ด๋ฉ”์ผ']
result['K์—ด'] = [''] * len(updated_order_df)
result['L์—ด'] = (updated_order_df['์ฃผ๋ฌธํ•ฉ๊ณ„'] / 1.1).round().astype(int) # ๊ณต๊ธ‰๊ฐ€์•ก (๋ฐ˜์˜ฌ๋ฆผํ•˜์—ฌ ์ •์ˆ˜๋กœ ๋ณ€ํ™˜)
result['M์—ด'] = (updated_order_df['์ฃผ๋ฌธํ•ฉ๊ณ„'] - result['L์—ด']).round().astype(int) # ๋ถ€๊ฐ€์„ธ (๋ฐ˜์˜ฌ๋ฆผํ•˜์—ฌ ์ •์ˆ˜๋กœ ๋ณ€ํ™˜)
result['N์—ด'] = [''] * len(updated_order_df)
result['O์—ด'] = [str(์ž‘์„ฑ์ผ์ž)[-2:]] * len(updated_order_df)
result['P์—ด'] = ['์ฃผ๋ฐฉ์šฉํ’ˆ ์™ธ'] * len(updated_order_df)
# ๋‚˜๋จธ์ง€ ๊ณต๋ž€ ์—ด ์ฑ„์šฐ๊ธฐ (Q์—ด๋ถ€ํ„ฐ AY์—ด๊นŒ์ง€)
๊ณต๋ž€_์—ด = [chr(i) + '์—ด' for i in range(ord('Q'), ord('Z') + 1)] # Q~Z
๊ณต๋ž€_์—ด += [f"A{chr(i)}์—ด" for i in range(ord('A'), ord('Y') + 1)] # AA~AY
for col in ๊ณต๋ž€_์—ด:
result[col] = [''] * len(updated_order_df)
# AY์—ด ์„ค์ •
result['AY์—ด'] = ['01'] * len(updated_order_df)
# ๊ฒฐ๊ณผ ํŒŒ์ผ ์ €์žฅ
result_file = f"๊ฒฐ๊ณผ_์„ธ๊ธˆ๊ณ„์‚ฐ์„œ_{datetime.now().strftime('%Y%m%d_%H%M%S')}.xlsx"
result.to_excel(result_file, index=False)
return result_file, updated_order_file_path
except Exception as e:
return f"์—๋Ÿฌ ๋ฐœ์ƒ: {str(e)}"
# Gradio ์ธํ„ฐํŽ˜์ด์Šค ๊ตฌ์„ฑ
def generate_excel(member_file, order_file, ์ž‘์„ฑ์ผ์ž):
output_files = process_excel_files(member_file.name, order_file.name, ์ž‘์„ฑ์ผ์ž)
if isinstance(output_files, str): # ์—๋Ÿฌ ๋ฉ”์‹œ์ง€ ๋ฐ˜ํ™˜
return output_files, None
else:
return output_files # (result_file, updated_order_file)
# Gradio UI
with gr.Blocks() as app:
gr.Markdown("### ์„ธ๊ธˆ๊ณ„์‚ฐ์„œ ์—‘์…€ ํŒŒ์ผ ์ƒ์„ฑ๊ธฐ")
with gr.Row():
member_file = gr.File(label="ํšŒ์›์ •๋ณด ์—‘์…€ ํŒŒ์ผ ์—…๋กœ๋“œ", file_types=[".xlsx"])
order_file = gr.File(label="์ฃผ๋ฌธ๋‚ด์—ญ ์—‘์…€ ํŒŒ์ผ ์—…๋กœ๋“œ", file_types=[".xlsx"])
์ž‘์„ฑ์ผ์ž = gr.Textbox(label="์ž‘์„ฑ์ผ์ž (YYYYMMDD)", placeholder="์˜ˆ: 20250101")
generate_btn = gr.Button("์—‘์…€ ์ƒ์„ฑ")
with gr.Row():
result_file_output = gr.File(label="๊ฒฐ๊ณผ ์„ธ๊ธˆ๊ณ„์‚ฐ์„œ ํŒŒ์ผ ๋‹ค์šด๋กœ๋“œ")
updated_order_file_output = gr.File(label="์ฃผ๋ฌธ๋‚ด์—ญ(์ˆ˜์ •) ํŒŒ์ผ ๋‹ค์šด๋กœ๋“œ")
generate_btn.click(generate_excel, inputs=[member_file, order_file, ์ž‘์„ฑ์ผ์ž], outputs=[result_file_output, updated_order_file_output])
app.launch()