From 3b8f8b232c1cd4bea412acbde49857b385039a3b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=8B=9C=EA=B3=A8=EC=95=BD=EC=82=AC?= Date: Fri, 23 Jan 2026 16:58:48 +0900 Subject: [PATCH] =?UTF-8?q?feat:=20POS=20GUI=EC=97=90=20=EC=A0=81=EB=A6=BD?= =?UTF-8?q?=ED=8F=AC=EC=9D=B8=ED=8A=B8=20=EC=BB=AC=EB=9F=BC=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 적립 사용자 정보와 함께 적립포인트 표시 - claim_tokens 테이블에서 claimable_points 조회 - 포인트 포맷: 천단위 콤마 + 'P' 접미사 (예: 1,500P) - 녹색 볼드 텍스트, 우측 정렬 - 테이블 컬럼 수: 7개 → 8개 - 윈도우 너비: 1200px → 1300px Co-Authored-By: Claude Sonnet 4.5 --- backend/gui/pos_sales_gui.py | 24 +++++++++++++++++++----- 1 file changed, 19 insertions(+), 5 deletions(-) diff --git a/backend/gui/pos_sales_gui.py b/backend/gui/pos_sales_gui.py index 5161814..90137f3 100644 --- a/backend/gui/pos_sales_gui.py +++ b/backend/gui/pos_sales_gui.py @@ -83,7 +83,7 @@ class SalesQueryThread(QThread): # SQLite에서 적립 사용자 조회 sqlite_cursor.execute(""" - SELECT u.nickname, u.phone + SELECT u.nickname, u.phone, ct.claimable_points FROM claim_tokens ct LEFT JOIN users u ON ct.claimed_by_user_id = u.id WHERE ct.transaction_id = ? AND ct.claimed_at IS NOT NULL @@ -94,9 +94,11 @@ class SalesQueryThread(QThread): if claimed_user and claimed_user['nickname'] and claimed_user['phone']: claimed_name = claimed_user['nickname'] claimed_phone = claimed_user['phone'] + claimed_points = claimed_user['claimable_points'] else: claimed_name = "" claimed_phone = "" + claimed_points = 0 sales_list.append({ 'order_no': order_no, @@ -105,7 +107,8 @@ class SalesQueryThread(QThread): 'customer': customer, 'item_count': item_count, 'claimed_name': claimed_name, - 'claimed_phone': claimed_phone + 'claimed_phone': claimed_phone, + 'claimed_points': claimed_points }) self.query_complete.emit(sales_list) @@ -376,7 +379,7 @@ class POSSalesGUI(QMainWindow): def init_ui(self): """UI 초기화""" self.setWindowTitle('POS 판매 조회') - self.setGeometry(100, 100, 1200, 600) + self.setGeometry(100, 100, 1300, 600) # 중앙 위젯 central_widget = QWidget() @@ -430,9 +433,9 @@ class POSSalesGUI(QMainWindow): sales_group.setLayout(sales_layout) self.sales_table = QTableWidget() - self.sales_table.setColumnCount(7) + self.sales_table.setColumnCount(8) self.sales_table.setHorizontalHeaderLabels([ - '주문번호', '시간', '금액', '고객명', '품목수', '적립자명', '전화번호' + '주문번호', '시간', '금액', '고객명', '품목수', '적립자명', '전화번호', '적립포인트' ]) self.sales_table.setColumnWidth(0, 160) self.sales_table.setColumnWidth(1, 70) @@ -441,6 +444,7 @@ class POSSalesGUI(QMainWindow): self.sales_table.setColumnWidth(4, 70) self.sales_table.setColumnWidth(5, 100) self.sales_table.setColumnWidth(6, 120) + self.sales_table.setColumnWidth(7, 100) self.sales_table.setSelectionBehavior(QTableWidget.SelectRows) self.sales_table.doubleClicked.connect(self.show_sale_detail) @@ -554,6 +558,16 @@ class POSSalesGUI(QMainWindow): claimed_phone_item.setFont(font) self.sales_table.setItem(row, 6, claimed_phone_item) + # 적립포인트 (SQLite) + claimed_points_item = QTableWidgetItem(f"{sale['claimed_points']:,}P" if sale['claimed_points'] > 0 else "") + if sale['claimed_points'] > 0: + claimed_points_item.setForeground(QColor('#4CAF50')) + claimed_points_item.setTextAlignment(Qt.AlignRight | Qt.AlignVCenter) + font = QFont() + font.setBold(True) + claimed_points_item.setFont(font) + self.sales_table.setItem(row, 7, claimed_points_item) + def on_query_error(self, error_msg): """DB 조회 에러 처리""" QMessageBox.critical(self, '오류', f'조회 실패:\n{error_msg}')