GUI 기능은 사용하지 않으므로 제거함
This commit is contained in:
@ -1,22 +1,16 @@
|
|||||||
# POS Update
|
# POS Update
|
||||||
'''
|
'''
|
||||||
포스 데이터를 추출한 엑셀파일을 업데이트
|
|
||||||
OK포스 > 매출관리 > 일자별 > 상품별 > 날짜 지정 > 조회줄수 5000으로 변경 > 엑셀
|
OK포스 > 매출관리 > 일자별 > 상품별 > 날짜 지정 > 조회줄수 5000으로 변경 > 엑셀
|
||||||
추출파일을 ./data에 복사
|
추출파일을 ./data에 복사
|
||||||
본 파일 실행하면 자동으로 mariadb의 DB에 삽입함.
|
본 파일 실행하면 자동으로 mariadb의 DB에 삽입함.
|
||||||
|
|
||||||
'''
|
'''
|
||||||
|
|
||||||
|
|
||||||
import sys, os
|
import sys, os
|
||||||
sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), '..')))
|
|
||||||
|
|
||||||
import tkinter as tk
|
|
||||||
import pandas as pd
|
import pandas as pd
|
||||||
from tkinter import filedialog, messagebox
|
|
||||||
from sqlalchemy.dialects.mysql import insert as mysql_insert
|
from sqlalchemy.dialects.mysql import insert as mysql_insert
|
||||||
from sqlalchemy.exc import IntegrityError
|
from sqlalchemy.exc import IntegrityError
|
||||||
|
|
||||||
|
sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), '..')))
|
||||||
from conf import db, db_schema
|
from conf import db, db_schema
|
||||||
from lib.common import load_config
|
from lib.common import load_config
|
||||||
|
|
||||||
@ -29,14 +23,12 @@ def update_pos_table(engine, table, df):
|
|||||||
data = row.to_dict()
|
data = row.to_dict()
|
||||||
stmt = mysql_insert(table).values(**data)
|
stmt = mysql_insert(table).values(**data)
|
||||||
|
|
||||||
# insert ... on duplicate key update (복합 unique key 기준)
|
|
||||||
update_data = {
|
update_data = {
|
||||||
'qty': data['qty'],
|
'qty': data['qty'],
|
||||||
'tot_amount': data['tot_amount'],
|
'tot_amount': data['tot_amount'],
|
||||||
'tot_discount': data['tot_discount'],
|
'tot_discount': data['tot_discount'],
|
||||||
'actual_amount': data['actual_amount']
|
'actual_amount': data['actual_amount']
|
||||||
}
|
}
|
||||||
|
|
||||||
stmt = stmt.on_duplicate_key_update(**update_data)
|
stmt = stmt.on_duplicate_key_update(**update_data)
|
||||||
|
|
||||||
try:
|
try:
|
||||||
@ -50,7 +42,6 @@ def process_file(filepath, table, engine):
|
|||||||
print(f"[INFO] 처리 시작: {filepath}")
|
print(f"[INFO] 처리 시작: {filepath}")
|
||||||
try:
|
try:
|
||||||
ext = os.path.splitext(filepath)[-1].lower()
|
ext = os.path.splitext(filepath)[-1].lower()
|
||||||
|
|
||||||
if ext == ".xls":
|
if ext == ".xls":
|
||||||
df = pd.read_excel(filepath, header=5, engine="xlrd")
|
df = pd.read_excel(filepath, header=5, engine="xlrd")
|
||||||
elif ext == ".xlsx":
|
elif ext == ".xlsx":
|
||||||
@ -73,8 +64,7 @@ def process_file(filepath, table, engine):
|
|||||||
'실매출액': 'actual_amount'
|
'실매출액': 'actual_amount'
|
||||||
}, inplace=True)
|
}, inplace=True)
|
||||||
|
|
||||||
if 'idx' in df.columns:
|
df.drop(columns=[col for col in ['idx'] if col in df.columns], inplace=True)
|
||||||
df = df.drop(columns=['idx'])
|
|
||||||
|
|
||||||
df['date'] = pd.to_datetime(df['date']).dt.date
|
df['date'] = pd.to_datetime(df['date']).dt.date
|
||||||
df['barcode'] = df['barcode'].astype(int)
|
df['barcode'] = df['barcode'].astype(int)
|
||||||
@ -98,37 +88,29 @@ def process_file(filepath, table, engine):
|
|||||||
|
|
||||||
def batch_process_files(table, engine):
|
def batch_process_files(table, engine):
|
||||||
files = [f for f in os.listdir(DATA_DIR) if f.startswith("일자별 (상품별)") and f.endswith(('.xlsx', '.xls'))]
|
files = [f for f in os.listdir(DATA_DIR) if f.startswith("일자별 (상품별)") and f.endswith(('.xlsx', '.xls'))]
|
||||||
|
|
||||||
if not files:
|
if not files:
|
||||||
print("[INFO] 처리할 파일이 없습니다.")
|
print("[INFO] 처리할 파일이 없습니다.")
|
||||||
return False
|
return False
|
||||||
|
|
||||||
print(f"[INFO] {len(files)}개의 파일을 찾았습니다.")
|
print(f"[INFO] {len(files)}개의 파일을 찾았습니다.")
|
||||||
total_rows = 0
|
total_rows = 0
|
||||||
|
deleted_files = 0
|
||||||
|
|
||||||
print(f"[INFO] 처리된 전체 데이터 건수: {total_rows}")
|
for fname in files:
|
||||||
return True
|
full_path = os.path.join(DATA_DIR, fname)
|
||||||
|
success, count = process_file(full_path, table, engine)
|
||||||
def run_pos_update():
|
|
||||||
filepath = filedialog.askopenfilename(
|
|
||||||
filetypes=[("Excel Files", "*.xlsx *.xls")],
|
|
||||||
title="파일을 선택하세요"
|
|
||||||
)
|
|
||||||
if not filepath:
|
|
||||||
return
|
|
||||||
|
|
||||||
engine = db.engine
|
|
||||||
try:
|
|
||||||
table = db_schema.pos
|
|
||||||
except AttributeError:
|
|
||||||
messagebox.showerror("DB 오류", "'pos' 테이블이 db_schema에 정의되어 있지 않습니다.")
|
|
||||||
return
|
|
||||||
|
|
||||||
if messagebox.askyesno("확인", f"'{os.path.basename(filepath)}' 파일을 'pos' 테이블에 업로드 하시겠습니까?"):
|
|
||||||
success, count = process_file(filepath, table, engine)
|
|
||||||
if success:
|
if success:
|
||||||
print(f"[INFO] 수동 선택된 파일 처리 완료: {count}건")
|
total_rows += count
|
||||||
messagebox.showinfo("완료", f"DB 업데이트가 완료되었습니다.\n총 {count}건 처리됨.")
|
try:
|
||||||
|
os.remove(full_path)
|
||||||
|
print(f"[INFO] 파일 삭제 완료: {fname}")
|
||||||
|
deleted_files += 1
|
||||||
|
except Exception as e:
|
||||||
|
print(f"[WARN] 파일 삭제 실패: {fname} / {e}")
|
||||||
|
|
||||||
|
print(f"[INFO] 총 처리 데이터 건수: {total_rows}")
|
||||||
|
print(f"[INFO] 삭제된 파일 수: {deleted_files}")
|
||||||
|
return True
|
||||||
|
|
||||||
def main():
|
def main():
|
||||||
engine = db.engine
|
engine = db.engine
|
||||||
@ -140,19 +122,7 @@ def main():
|
|||||||
|
|
||||||
batch_done = batch_process_files(table, engine)
|
batch_done = batch_process_files(table, engine)
|
||||||
if not batch_done:
|
if not batch_done:
|
||||||
print("[ERROR] batch_process_files 실행 실패")
|
print("[INFO] 처리할 데이터가 없습니다.")
|
||||||
# # GUI 시작
|
|
||||||
# root = tk.Tk()
|
|
||||||
# root.title("POS 데이터 업데이트")
|
|
||||||
# root.geometry("300x150")
|
|
||||||
#
|
|
||||||
# lbl = tk.Label(root, text="POS 데이터 업데이트")
|
|
||||||
# lbl.pack(pady=20)
|
|
||||||
#
|
|
||||||
# btn = tk.Button(root, text="데이터 선택 및 업데이트", command=run_pos_update)
|
|
||||||
# btn.pack()
|
|
||||||
#
|
|
||||||
# root.mainloop()
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
main()
|
main()
|
||||||
|
|||||||
Reference in New Issue
Block a user