diff --git a/backend/scripts/analyze_mapping_keys.py b/backend/scripts/analyze_mapping_keys.py new file mode 100644 index 0000000..3759651 --- /dev/null +++ b/backend/scripts/analyze_mapping_keys.py @@ -0,0 +1,82 @@ +# -*- coding: utf-8 -*- +""" +CD_GOODS / CD_BARCODE에서 외부 DB와 매핑 가능한 키 분석 +""" +import sys +sys.path.insert(0, 'c:\\Users\\청춘약국\\source\\pharmacy-pos-qr-system\\backend') + +from db.dbsetup import get_db_session +from sqlalchemy import text + +session = get_db_session('PM_DRUG') + +print('=' * 60) +print('=== CD_GOODS 주요 컬럼 (외부 매핑 후보) ===') +print('=' * 60) + +# CD_GOODS 샘플 +result = session.execute(text(""" + SELECT TOP 3 + DrugCode, GoodsName, BARCODE, BaseCode, + SUNG_CODE, TITLECODE, EffctCode + FROM CD_GOODS + WHERE GoodsSelCode = 'B' + ORDER BY DrugCode +""")) + +for row in result: + print(f'\nDrugCode: {row.DrugCode}') + print(f' GoodsName: {row.GoodsName}') + print(f' BARCODE: {row.BARCODE or "(없음)"}') + print(f' BaseCode: {row.BaseCode or "(없음)"}') + print(f' SUNG_CODE: {row.SUNG_CODE or "(없음)"}') + print(f' TITLECODE: {row.TITLECODE or "(없음)"}') + +print('\n' + '=' * 60) +print('=== CD_BARCODE 주요 컬럼 (외부 매핑 후보) ===') +print('=' * 60) + +# CD_BARCODE 샘플 +result2 = session.execute(text(""" + SELECT TOP 3 + DRUGCODE, BARCODE, BASECODE, ETCNAME, SPLNAME, + SUNG_CODE, DIK_CODE, TITLECODE + FROM CD_BARCODE + WHERE BASECODE IS NOT NULL AND BASECODE != '' +""")) + +for row in result2: + print(f'\nDRUGCODE: {row.DRUGCODE}') + print(f' BARCODE: {row.BARCODE}') + print(f' BASECODE: {row.BASECODE}') + print(f' ETCNAME: {row.ETCNAME}') + print(f' SPLNAME: {row.SPLNAME}') + print(f' SUNG_CODE: {row.SUNG_CODE or "(없음)"}') + print(f' DIK_CODE: {row.DIK_CODE or "(없음)"}') + print(f' TITLECODE: {row.TITLECODE}') + +print('\n' + '=' * 60) +print('=== 매핑 키 후보 통계 ===') +print('=' * 60) + +# 각 코드 현황 +result3 = session.execute(text(""" + SELECT + COUNT(*) as total, + SUM(CASE WHEN BARCODE IS NOT NULL AND BARCODE != '' THEN 1 ELSE 0 END) as has_barcode, + SUM(CASE WHEN BASECODE IS NOT NULL AND BASECODE != '' THEN 1 ELSE 0 END) as has_basecode, + SUM(CASE WHEN SUNG_CODE IS NOT NULL AND SUNG_CODE != '' THEN 1 ELSE 0 END) as has_sungcode, + SUM(CASE WHEN DIK_CODE IS NOT NULL AND DIK_CODE != '' THEN 1 ELSE 0 END) as has_dikcode, + SUM(CASE WHEN TITLECODE IS NOT NULL AND TITLECODE != '' THEN 1 ELSE 0 END) as has_titlecode + FROM CD_BARCODE +""")) + +row = result3.fetchone() +print(f'\nCD_BARCODE 전체: {row.total:,}개') +print(f' BARCODE 있음: {row.has_barcode:,}개 ({row.has_barcode/row.total*100:.1f}%)') +print(f' BASECODE 있음: {row.has_basecode:,}개 ({row.has_basecode/row.total*100:.1f}%)') +print(f' SUNG_CODE 있음: {row.has_sungcode:,}개 ({row.has_sungcode/row.total*100:.1f}%)') +print(f' DIK_CODE 있음: {row.has_dikcode:,}개 ({row.has_dikcode/row.total*100:.1f}%)') +print(f' TITLECODE 있음: {row.has_titlecode:,}개 ({row.has_titlecode/row.total*100:.1f}%)') + +session.close() diff --git a/backend/scripts/check_animal_basecode.py b/backend/scripts/check_animal_basecode.py new file mode 100644 index 0000000..36f3065 --- /dev/null +++ b/backend/scripts/check_animal_basecode.py @@ -0,0 +1,53 @@ +# -*- coding: utf-8 -*- +import sys +sys.path.insert(0, 'c:\\Users\\청춘약국\\source\\pharmacy-pos-qr-system\\backend') + +from db.dbsetup import get_db_session +from sqlalchemy import text + +session = get_db_session('PM_DRUG') + +# 동물약(POS_BOON='010103')을 CD_BARCODE와 JOIN해서 BASECODE 찾기 +print('=== 동물약 BASECODE 조회 (CD_GOODS + CD_BARCODE JOIN) ===\n') + +result = session.execute(text(""" + SELECT + g.DrugCode, + g.GoodsName, + g.BARCODE as goods_barcode, + b.BARCODE as std_barcode, + b.BASECODE, + b.SUNG_CODE, + b.DIK_CODE, + b.ETCNAME + FROM CD_GOODS g + LEFT JOIN CD_BARCODE b ON g.DrugCode = b.DRUGCODE + WHERE g.POS_BOON = '010103' AND g.GoodsSelCode = 'B' + ORDER BY g.GoodsName +""")) + +found = 0 +not_found = 0 + +for row in result: + if row.BASECODE: + found += 1 + mark = '[O]' + else: + not_found += 1 + mark = '[X]' + + print(f'{mark} {row.GoodsName}') + print(f' DrugCode: {row.DrugCode}') + print(f' CD_GOODS.BARCODE: {row.goods_barcode or "(없음)"}') + if row.BASECODE: + print(f' CD_BARCODE.BARCODE: {row.std_barcode}') + print(f' BASECODE: {row.BASECODE}') + print(f' SUNG_CODE: {row.SUNG_CODE}') + print() + +print('---') +print(f'CD_BARCODE에서 찾음: {found}개') +print(f'CD_BARCODE에 없음: {not_found}개') + +session.close() diff --git a/backend/scripts/check_animal_codes.py b/backend/scripts/check_animal_codes.py new file mode 100644 index 0000000..6b124ec --- /dev/null +++ b/backend/scripts/check_animal_codes.py @@ -0,0 +1,44 @@ +# -*- coding: utf-8 -*- +import sys +sys.path.insert(0, 'c:\\Users\\청춘약국\\source\\pharmacy-pos-qr-system\\backend') + +from db.dbsetup import get_db_session +from sqlalchemy import text + +session = get_db_session('PM_DRUG') + +result = session.execute(text(""" + SELECT DrugCode, GoodsName, BARCODE, BaseCode + FROM CD_GOODS + WHERE POS_BOON = '010103' AND GoodsSelCode = 'B' + ORDER BY GoodsName +""")) + +print('=== 동물약 바코드/표준코드 현황 ===\n') + +barcode_count = 0 +basecode_count = 0 +total = 0 + +for row in result: + barcode = row.BARCODE.strip() if row.BARCODE else '' + basecode = row.BaseCode.strip() if row.BaseCode else '' + + if barcode: barcode_count += 1 + if basecode: basecode_count += 1 + total += 1 + + b_mark = 'O' if barcode else 'X' + c_mark = 'O' if basecode else 'X' + print(f'{row.GoodsName}') + print(f' DrugCode: {row.DrugCode}') + print(f' Barcode: {b_mark} [{barcode}]') + print(f' BaseCode: {c_mark} [{basecode}]') + print() + +print('---') +print(f'Total: {total}개') +print(f'With Barcode: {barcode_count}개') +print(f'With BaseCode: {basecode_count}개') + +session.close() diff --git a/backend/scripts/check_apc_added.py b/backend/scripts/check_apc_added.py new file mode 100644 index 0000000..c15bce9 --- /dev/null +++ b/backend/scripts/check_apc_added.py @@ -0,0 +1,76 @@ +# -*- coding: utf-8 -*- +import sys +import io +sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8', errors='replace') +sys.path.insert(0, 'c:\\Users\\청춘약국\\source\\pharmacy-pos-qr-system\\backend') + +from db.dbsetup import get_db_session +from sqlalchemy import text + +session = get_db_session('PM_DRUG') + +print('=' * 60) +print('=== 1. CD_GOODS 테이블 확인 (안텔민뽀삐) ===') +print('=' * 60) + +result = session.execute(text(""" + SELECT DrugCode, GoodsName, BARCODE, BaseCode + FROM CD_GOODS + WHERE DrugCode = 'LB000003158' +""")) + +for row in result: + print(f'DrugCode: {row.DrugCode}') + print(f'GoodsName: {row.GoodsName}') + print(f'BARCODE: {row.BARCODE or "(없음)"}') + print(f'BaseCode: {row.BaseCode or "(없음)"}') + +print() +print('=' * 60) +print('=== 2. CD_BARCODE 테이블 확인 (DrugCode로 검색) ===') +print('=' * 60) + +result2 = session.execute(text(""" + SELECT * + FROM CD_BARCODE + WHERE DRUGCODE = 'LB000003158' +""")) + +columns = result2.keys() +rows = list(result2) + +if rows: + for row in rows: + print(f'\n--- 바코드 레코드 ---') + for col in columns: + val = getattr(row, col) + if val: + print(f' {col}: {val}') +else: + print('(CD_BARCODE에 레코드 없음)') + +print() +print('=' * 60) +print('=== 3. CD_BARCODE에서 APC로 직접 검색 ===') +print('=' * 60) + +result3 = session.execute(text(""" + SELECT * + FROM CD_BARCODE + WHERE BARCODE = '0230237010107' + OR BASECODE = '0230237010107' + OR TITLECODE = '0230237010107' +""")) + +rows3 = list(result3) +if rows3: + for row in rows3: + print(f'\n--- APC로 찾은 레코드 ---') + for col in columns: + val = getattr(row, col) + if val: + print(f' {col}: {val}') +else: + print('(APC로 검색된 레코드 없음)') + +session.close() diff --git a/backend/scripts/check_basecode.py b/backend/scripts/check_basecode.py new file mode 100644 index 0000000..8faa922 --- /dev/null +++ b/backend/scripts/check_basecode.py @@ -0,0 +1,64 @@ +# -*- coding: utf-8 -*- +import sys +sys.path.insert(0, 'c:\\Users\\청춘약국\\source\\pharmacy-pos-qr-system\\backend') + +from db.dbsetup import get_db_session +from sqlalchemy import text + +session = get_db_session('PM_DRUG') + +# 1. BaseCode가 있는 제품 수 확인 +result = session.execute(text(""" + SELECT + COUNT(*) as total, + SUM(CASE WHEN BaseCode IS NOT NULL AND BaseCode != '' THEN 1 ELSE 0 END) as with_basecode + FROM CD_GOODS + WHERE GoodsSelCode = 'B' +""")) +row = result.fetchone() +print(f'=== BaseCode 사용 현황 ===') +print(f'판매중 전체 제품: {row.total}개') +print(f'BaseCode 있는 제품: {row.with_basecode}개') +print() + +# 2. BaseCode가 있는 제품 샘플 (최대 20개) +result2 = session.execute(text(""" + SELECT TOP 20 DrugCode, GoodsName, BaseCode, POS_BOON + FROM CD_GOODS + WHERE GoodsSelCode = 'B' + AND BaseCode IS NOT NULL + AND BaseCode != '' + ORDER BY GoodsName +""")) + +print('=== BaseCode 있는 제품 샘플 ===') +count = 0 +for row in result2: + count += 1 + print(f'{row.GoodsName}') + print(f' DrugCode: {row.DrugCode}') + print(f' BaseCode: {row.BaseCode}') + print(f' 분류: {row.POS_BOON}') + print() + +if count == 0: + print('(BaseCode가 있는 제품이 없습니다)') + +# 3. 분류별 BaseCode 사용 현황 +print('=== 분류(POS_BOON)별 BaseCode 현황 ===') +result3 = session.execute(text(""" + SELECT + POS_BOON, + COUNT(*) as total, + SUM(CASE WHEN BaseCode IS NOT NULL AND BaseCode != '' THEN 1 ELSE 0 END) as with_basecode + FROM CD_GOODS + WHERE GoodsSelCode = 'B' + GROUP BY POS_BOON + HAVING SUM(CASE WHEN BaseCode IS NOT NULL AND BaseCode != '' THEN 1 ELSE 0 END) > 0 + ORDER BY with_basecode DESC +""")) + +for row in result3: + print(f'분류 {row.POS_BOON}: {row.with_basecode}/{row.total}개') + +session.close() diff --git a/backend/scripts/check_basecode_stats.py b/backend/scripts/check_basecode_stats.py new file mode 100644 index 0000000..8032646 --- /dev/null +++ b/backend/scripts/check_basecode_stats.py @@ -0,0 +1,26 @@ +# -*- coding: utf-8 -*- +import sys +sys.path.insert(0, 'c:\\Users\\청춘약국\\source\\pharmacy-pos-qr-system\\backend') + +from db.dbsetup import get_db_session +from sqlalchemy import text + +session = get_db_session('PM_DRUG') + +result = session.execute(text(""" + SELECT + COUNT(*) as total, + SUM(CASE WHEN BASECODE IS NULL THEN 1 ELSE 0 END) as null_count, + SUM(CASE WHEN BASECODE = '' THEN 1 ELSE 0 END) as empty_count, + SUM(CASE WHEN BASECODE IS NOT NULL AND BASECODE != '' THEN 1 ELSE 0 END) as has_value + FROM CD_BARCODE +""")) + +row = result.fetchone() +print('=== CD_BARCODE.BASECODE 현황 ===') +print(f'전체: {row.total:,}개') +print(f'NULL: {row.null_count:,}개') +print(f'빈문자열: {row.empty_count:,}개') +print(f'값 있음: {row.has_value:,}개 ({row.has_value/row.total*100:.1f}%)') + +session.close() diff --git a/backend/scripts/check_basecode_usage.py b/backend/scripts/check_basecode_usage.py new file mode 100644 index 0000000..1cdb296 --- /dev/null +++ b/backend/scripts/check_basecode_usage.py @@ -0,0 +1,74 @@ +# -*- coding: utf-8 -*- +import sys +sys.path.insert(0, 'c:\\Users\\청춘약국\\source\\pharmacy-pos-qr-system\\backend') + +from db.dbsetup import get_db_session +from sqlalchemy import text + +# PM_DRUG, PM_PRES, PM_BASE 모든 DB 확인 +databases = ['PM_DRUG', 'PM_PRES', 'PM_BASE'] + +for db_name in databases: + print(f'\n{"="*50}') + print(f'=== {db_name} 데이터베이스 ===') + print(f'{"="*50}') + + try: + session = get_db_session(db_name) + + # 1. BaseCode 컬럼이 있는 테이블 찾기 + result = session.execute(text(""" + SELECT TABLE_NAME, COLUMN_NAME + FROM INFORMATION_SCHEMA.COLUMNS + WHERE COLUMN_NAME LIKE '%BaseCode%' + OR COLUMN_NAME LIKE '%BASECODE%' + OR COLUMN_NAME LIKE '%basecode%' + ORDER BY TABLE_NAME + """)) + + tables = list(result) + if tables: + print(f'\nBaseCode 관련 컬럼 발견:') + for row in tables: + print(f' - {row.TABLE_NAME}.{row.COLUMN_NAME}') + else: + print(f'\nBaseCode 관련 컬럼 없음') + + # 2. 표준코드 관련 컬럼 찾기 (Stand, Standard 등) + result2 = session.execute(text(""" + SELECT TABLE_NAME, COLUMN_NAME + FROM INFORMATION_SCHEMA.COLUMNS + WHERE COLUMN_NAME LIKE '%Stand%' + OR COLUMN_NAME LIKE '%Standard%' + OR COLUMN_NAME LIKE '%KD%' + ORDER BY TABLE_NAME + """)) + + tables2 = list(result2) + if tables2: + print(f'\n표준코드 관련 컬럼:') + for row in tables2: + print(f' - {row.TABLE_NAME}.{row.COLUMN_NAME}') + + session.close() + + except Exception as e: + print(f'Error: {e}') + +# 3. CD_GOODS의 BaseCode가 실제로 어떤 값인지 상위 10개 확인 +print(f'\n{"="*50}') +print('=== CD_GOODS.BaseCode 샘플 데이터 ===') +print(f'{"="*50}') + +session = get_db_session('PM_DRUG') +result = session.execute(text(""" + SELECT TOP 10 DrugCode, GoodsName, BaseCode + FROM CD_GOODS + ORDER BY DrugCode +""")) + +for row in result: + bc = row.BaseCode if row.BaseCode else '(NULL/빈값)' + print(f'{row.DrugCode}: BaseCode=[{bc}]') + +session.close() diff --git a/backend/scripts/check_cd_barcode.py b/backend/scripts/check_cd_barcode.py new file mode 100644 index 0000000..7733c4b --- /dev/null +++ b/backend/scripts/check_cd_barcode.py @@ -0,0 +1,71 @@ +# -*- coding: utf-8 -*- +import sys +sys.path.insert(0, 'c:\\Users\\청춘약국\\source\\pharmacy-pos-qr-system\\backend') + +from db.dbsetup import get_db_session +from sqlalchemy import text + +session = get_db_session('PM_DRUG') + +# 1. CD_BARCODE 테이블 구조 +print('=== CD_BARCODE 테이블 구조 ===') +result = session.execute(text(""" + SELECT COLUMN_NAME, DATA_TYPE, CHARACTER_MAXIMUM_LENGTH + FROM INFORMATION_SCHEMA.COLUMNS + WHERE TABLE_NAME = 'CD_BARCODE' + ORDER BY ORDINAL_POSITION +""")) +for row in result: + print(f' {row.COLUMN_NAME} ({row.DATA_TYPE})') + +# 2. CD_BARCODE 데이터 샘플 +print('\n=== CD_BARCODE 샘플 데이터 (BASECODE 있는 것) ===') +result2 = session.execute(text(""" + SELECT TOP 20 * + FROM CD_BARCODE + WHERE BASECODE IS NOT NULL AND BASECODE != '' +""")) + +columns = result2.keys() +print(f'컬럼: {list(columns)}') +print() + +count = 0 +for row in result2: + count += 1 + print(f'--- Row {count} ---') + for col in columns: + val = getattr(row, col) + if val: + print(f' {col}: {val}') + +if count == 0: + print('(BASECODE가 있는 레코드 없음)') + + # BASECODE 없어도 샘플 보기 + print('\n=== CD_BARCODE 전체 샘플 (상위 5개) ===') + result3 = session.execute(text(""" + SELECT TOP 5 * + FROM CD_BARCODE + """)) + for row in result3: + print(f'---') + for col in columns: + val = getattr(row, col) + print(f' {col}: {val}') + +# 3. CD_BARCODE 전체 레코드 수 +print('\n=== CD_BARCODE 통계 ===') +result4 = session.execute(text(""" + SELECT + COUNT(*) as total, + SUM(CASE WHEN BASECODE IS NOT NULL AND BASECODE != '' THEN 1 ELSE 0 END) as with_basecode, + SUM(CASE WHEN DSTANDARD IS NOT NULL AND DSTANDARD != '' THEN 1 ELSE 0 END) as with_dstandard + FROM CD_BARCODE +""")) +row = result4.fetchone() +print(f'전체 레코드: {row.total}개') +print(f'BASECODE 있음: {row.with_basecode}개') +print(f'DSTANDARD 있음: {row.with_dstandard}개') + +session.close() diff --git a/backend/scripts/check_king.py b/backend/scripts/check_king.py new file mode 100644 index 0000000..0edfa77 --- /dev/null +++ b/backend/scripts/check_king.py @@ -0,0 +1,53 @@ +# -*- coding: utf-8 -*- +import sys +import io +sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8', errors='replace') +sys.path.insert(0, 'c:\\Users\\청춘약국\\source\\pharmacy-pos-qr-system\\backend') + +from db.dbsetup import get_db_session +from sqlalchemy import text + +session = get_db_session('PM_DRUG') + +print('=== CD_GOODS (안텔민킹 - LB000003157) ===') +result = session.execute(text(""" + SELECT DrugCode, GoodsName, BARCODE, BaseCode + FROM CD_GOODS + WHERE DrugCode = 'LB000003157' +""")) + +for row in result: + print(f'DrugCode: {row.DrugCode}') + print(f'GoodsName: {row.GoodsName}') + print(f'BARCODE: [{row.BARCODE}]') + print(f'BaseCode: [{row.BaseCode}]') + +print('\n=== CD_BARCODE (DrugCode = LB000003157) ===') +result2 = session.execute(text(""" + SELECT DRUGCODE, BARCODE, BASECODE, TITLECODE, ETCNAME + FROM CD_BARCODE + WHERE DRUGCODE = 'LB000003157' +""")) + +for row in result2: + print(f'DRUGCODE: {row.DRUGCODE}') + print(f'BARCODE: {row.BARCODE}') + print(f'BASECODE: {row.BASECODE}') + print(f'TITLECODE: {row.TITLECODE}') + print(f'ETCNAME: {row.ETCNAME}') + +print('\n=== APC로 직접 검색 ===') +result3 = session.execute(text(""" + SELECT DRUGCODE, BARCODE, BASECODE, ETCNAME + FROM CD_BARCODE + WHERE BARCODE = '0230237010107' +""")) + +rows = list(result3) +if rows: + for row in rows: + print(f'★ 발견! DRUGCODE: {row.DRUGCODE}, BARCODE: {row.BARCODE}') +else: + print('(APC로 검색 안됨)') + +session.close() diff --git a/backend/scripts/check_multi_barcode.py b/backend/scripts/check_multi_barcode.py new file mode 100644 index 0000000..0d911a3 --- /dev/null +++ b/backend/scripts/check_multi_barcode.py @@ -0,0 +1,74 @@ +# -*- coding: utf-8 -*- +import sys +import io +sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8', errors='replace') +sys.path.insert(0, 'c:\\Users\\청춘약국\\source\\pharmacy-pos-qr-system\\backend') + +from db.dbsetup import get_db_session +from sqlalchemy import text + +session = get_db_session('PM_DRUG') + +print('=== 안텔민킹 (LB000003157) 바코드 전체 조회 ===\n') + +# 1. CD_SALEGOODS에서 같은 DrugCode로 여러 행? +print('1. CD_SALEGOODS (DrugCode = LB000003157):') +result = session.execute(text(""" + SELECT DrugCode, GoodsName, BARCODE + FROM CD_SALEGOODS + WHERE DrugCode = 'LB000003157' +""")) +for row in result: + print(f' {row.BARCODE}') + +# 2. 바코드 전용 테이블이 따로 있나? +print('\n2. 바코드 관련 테이블에서 LB000003157 검색:') + +tables = [ + 'CD_BARCODE', + 'CD_Bundle', + 'CD_ITEM_UNIT_MEMBER', + 'CD_NameTag', + 'BI_DRUG_MAPPING', + 'PharmBridgeMapping' +] + +for tbl in tables: + try: + result = session.execute(text(f""" + SELECT * FROM {tbl} + WHERE DrugCode = 'LB000003157' OR DRUGCODE = 'LB000003157' + """)) + rows = list(result) + if rows: + print(f'\n ★ {tbl}: {len(rows)}개 발견!') + for row in rows: + print(f' {dict(row._mapping)}') + except: + pass + +# 3. 바코드 값으로 역검색 (APC) +print('\n3. APC 0230237810109 검색 (전체 테이블):') +apc = '0230237810109' + +for tbl in ['CD_GOODS', 'CD_SALEGOODS', 'CD_BARCODE', 'CD_Bundle', 'BI_DRUG_MAPPING', 'PharmBridgeMapping']: + try: + # 바코드 관련 컬럼 찾기 + cols = session.execute(text(f""" + SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS + WHERE TABLE_NAME = '{tbl}' AND COLUMN_NAME LIKE '%BARCODE%' + """)) + for col_row in cols: + col = col_row.COLUMN_NAME + result = session.execute(text(f""" + SELECT * FROM {tbl} WHERE {col} = '{apc}' + """)) + rows = list(result) + if rows: + print(f' ★ {tbl}.{col}: {len(rows)}개!') + for row in rows: + print(f' {dict(row._mapping)}') + except Exception as e: + pass + +session.close() diff --git a/backend/scripts/check_name.py b/backend/scripts/check_name.py new file mode 100644 index 0000000..99375dd --- /dev/null +++ b/backend/scripts/check_name.py @@ -0,0 +1,24 @@ +# -*- coding: utf-8 -*- +import sys +sys.path.insert(0, 'c:\\Users\\청춘약국\\source\\pharmacy-pos-qr-system\\backend') + +from db.dbsetup import get_db_session +from sqlalchemy import text + +session = get_db_session('PM_DRUG') +result = session.execute(text(""" + SELECT DrugCode, GoodsName + FROM CD_GOODS + WHERE DrugCode = 'LB000003158' +""")) + +row = result.fetchone() +name = row.GoodsName +print('GoodsName:', name) +print('repr:', repr(name)) + +# 각 글자 확인 +for i, char in enumerate(name): + print(f' [{i}] {char} = U+{ord(char):04X}') + +session.close() diff --git a/backend/scripts/check_new_apc.py b/backend/scripts/check_new_apc.py new file mode 100644 index 0000000..cb8852b --- /dev/null +++ b/backend/scripts/check_new_apc.py @@ -0,0 +1,82 @@ +# -*- coding: utf-8 -*- +import sys +import io +sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8', errors='replace') +sys.path.insert(0, 'c:\\Users\\청춘약국\\source\\pharmacy-pos-qr-system\\backend') + +from db.dbsetup import get_db_session +from sqlalchemy import text + +session = get_db_session('PM_DRUG') + +apc = '0230237810109' + +print(f'=== APC "{apc}" 검색 ===\n') + +# 1. CD_GOODS에서 안텔민킹 확인 +print('1. CD_GOODS (안텔민킹):') +result = session.execute(text(""" + SELECT DrugCode, GoodsName, BARCODE, BaseCode + FROM CD_GOODS + WHERE DrugCode = 'LB000003157' +""")) +for row in result: + print(f' BARCODE: [{row.BARCODE}]') + +# 2. CD_BARCODE에서 DRUGCODE로 검색 +print('\n2. CD_BARCODE (DRUGCODE=LB000003157):') +result2 = session.execute(text(""" + SELECT DRUGCODE, BARCODE, BASECODE, ETCNAME + FROM CD_BARCODE + WHERE DRUGCODE = 'LB000003157' +""")) +rows = list(result2) +if rows: + for row in rows: + print(f' BARCODE: {row.BARCODE}, BASECODE: {row.BASECODE}') +else: + print(' (없음)') + +# 3. CD_BARCODE에서 APC 직접 검색 +print(f'\n3. CD_BARCODE에서 BARCODE="{apc}":') +result3 = session.execute(text(f""" + SELECT DRUGCODE, BARCODE, BASECODE, ETCNAME + FROM CD_BARCODE + WHERE BARCODE = '{apc}' +""")) +rows = list(result3) +if rows: + for row in rows: + print(f' ★ 발견! DRUGCODE: {row.DRUGCODE}') +else: + print(' (없음)') + +# 4. CD_GOODS에서 BARCODE로 검색 +print(f'\n4. CD_GOODS에서 BARCODE="{apc}":') +result4 = session.execute(text(f""" + SELECT DrugCode, GoodsName, BARCODE + FROM CD_GOODS + WHERE BARCODE = '{apc}' +""")) +rows = list(result4) +if rows: + for row in rows: + print(f' ★ 발견! {row.DrugCode}: {row.GoodsName}') +else: + print(' (없음)') + +# 5. 전체 DB에서 LIKE 검색 +print(f'\n5. 전체 LIKE 검색:') +result5 = session.execute(text(f""" + SELECT DrugCode, GoodsName, BARCODE + FROM CD_GOODS + WHERE BARCODE LIKE '%{apc}%' +""")) +rows = list(result5) +if rows: + for row in rows: + print(f' ★ {row.DrugCode}: BARCODE=[{row.BARCODE}]') +else: + print(' (없음)') + +session.close() diff --git a/backend/scripts/check_pgsql_animal_info.py b/backend/scripts/check_pgsql_animal_info.py new file mode 100644 index 0000000..1cbe1d2 --- /dev/null +++ b/backend/scripts/check_pgsql_animal_info.py @@ -0,0 +1,58 @@ +# -*- coding: utf-8 -*- +import sys +import io +sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8', errors='replace') +sys.path.insert(0, 'c:\\Users\\청춘약국\\source\\pharmacy-pos-qr-system\\backend') + +from db.dbsetup import get_db_session +from sqlalchemy import text + +session = get_db_session('anipharmacopeia') + +# 안텔민킹 APC로 검색 +apc = '0230237810109' + +print(f'=== PostgreSQL에서 APC {apc} 조회 ===\n') + +# anipharmacopeia 테이블 확인 +result = session.execute(text(""" + SELECT * FROM anipharmacopeia + WHERE apc = :apc +"""), {'apc': apc}) + +row = result.fetchone() +if row: + print('★ 발견!\n') + cols = result.keys() + for col in cols: + val = getattr(row, col) + if val: + print(f' {col}: {val}') +else: + print('(없음)') + +# 개/고양이 관련 컬럼 확인 +print('\n=== 개/고양이 관련 컬럼 확인 ===\n') +result2 = session.execute(text(""" + SELECT column_name, data_type + FROM information_schema.columns + WHERE table_name = 'anipharmacopeia' + AND (column_name LIKE '%dog%' OR column_name LIKE '%cat%' + OR column_name LIKE '%canine%' OR column_name LIKE '%feline%' + OR column_name LIKE '%animal%' OR column_name LIKE '%species%' + OR column_name LIKE '%target%' OR column_name LIKE '%use%') +""")) +for r in result2: + print(f' {r.column_name}: {r.data_type}') + +# 전체 컬럼 목록 +print('\n=== 전체 컬럼 목록 ===\n') +result3 = session.execute(text(""" + SELECT column_name FROM information_schema.columns + WHERE table_name = 'anipharmacopeia' + ORDER BY ordinal_position +""")) +for r in result3: + print(f' {r.column_name}') + +session.close() diff --git a/backend/scripts/check_pgsql_antelmin.py b/backend/scripts/check_pgsql_antelmin.py new file mode 100644 index 0000000..c360cb1 --- /dev/null +++ b/backend/scripts/check_pgsql_antelmin.py @@ -0,0 +1,26 @@ +# -*- coding: utf-8 -*- +from sqlalchemy import create_engine, text + +conn = create_engine('postgresql://admin:trajet6640@192.168.0.87:5432/apdb_master').connect() + +# 안텔민 전체 - 유니코드 확인 +result = conn.execute(text(""" + SELECT apc, product_name + FROM apc + WHERE product_name ILIKE '%안텔민%' + ORDER BY product_name +""")) + +print('=== PostgreSQL 안텔민 전체 (유니코드 확인) ===\n') +for row in result: + name = row.product_name + print(f'APC: {row.apc}') + print(f'Name: {name}') + + # "사" 또는 "뽀" 글자 찾아서 유니코드 확인 + for i, c in enumerate(name): + if c in ['사', '뽀', '삐', '킹']: + print(f' [{i}] "{c}" = U+{ord(c):04X}') + print() + +conn.close() diff --git a/backend/scripts/check_pgsql_columns.py b/backend/scripts/check_pgsql_columns.py new file mode 100644 index 0000000..7f2c934 --- /dev/null +++ b/backend/scripts/check_pgsql_columns.py @@ -0,0 +1,32 @@ +# -*- coding: utf-8 -*- +import sys +import io +sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8', errors='replace') + +from sqlalchemy import create_engine, text + +conn = create_engine('postgresql://admin:trajet6640@192.168.0.87:5432/apdb_master').connect() + +print('=== apc 테이블 전체 컬럼 ===\n') +result = conn.execute(text(""" + SELECT column_name, data_type + FROM information_schema.columns + WHERE table_name = 'apc' + ORDER BY ordinal_position +""")) +for r in result: + print(f' {r.column_name}: {r.data_type}') + +# 안텔민킹 전체 데이터 +apc_code = '0230237810109' +print(f'\n=== 안텔민킹 ({apc_code}) 전체 데이터 ===\n') +result2 = conn.execute(text(f"SELECT * FROM apc WHERE apc = '{apc_code}'")) +row = result2.fetchone() +if row: + cols = result2.keys() + for col in cols: + val = getattr(row, col) + if val: + print(f' {col}: {val}') + +conn.close() diff --git a/backend/scripts/check_salegoods.py b/backend/scripts/check_salegoods.py new file mode 100644 index 0000000..8af34b8 --- /dev/null +++ b/backend/scripts/check_salegoods.py @@ -0,0 +1,47 @@ +# -*- coding: utf-8 -*- +import sys +import io +sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8', errors='replace') +sys.path.insert(0, 'c:\\Users\\청춘약국\\source\\pharmacy-pos-qr-system\\backend') + +from db.dbsetup import get_db_session +from sqlalchemy import text + +session = get_db_session('PM_DRUG') + +print('=== CD_SALEGOODS 테이블 구조 ===\n') +result = session.execute(text(""" + SELECT COLUMN_NAME, DATA_TYPE + FROM INFORMATION_SCHEMA.COLUMNS + WHERE TABLE_NAME = 'CD_SALEGOODS' + ORDER BY ORDINAL_POSITION +""")) +for row in result: + print(f' {row.COLUMN_NAME}: {row.DATA_TYPE}') + +print('\n=== CD_SALEGOODS에서 안텔민 검색 ===\n') +result2 = session.execute(text(""" + SELECT * + FROM CD_SALEGOODS + WHERE DrugCode LIKE 'LB00000315%' OR BARCODE LIKE '0230237%' +""")) + +rows = list(result2) +if rows: + for row in rows: + print(f'★ 발견!') + print(f' {dict(row._mapping)}') +else: + print('(없음)') + +print('\n=== CD_SALEGOODS 최근 데이터 (상위 10개) ===\n') +result3 = session.execute(text(""" + SELECT TOP 10 * + FROM CD_SALEGOODS + ORDER BY DrugCode DESC +""")) + +for row in result3: + print(dict(row._mapping)) + +session.close() diff --git a/backend/scripts/check_table_relations.py b/backend/scripts/check_table_relations.py new file mode 100644 index 0000000..c90a913 --- /dev/null +++ b/backend/scripts/check_table_relations.py @@ -0,0 +1,80 @@ +# -*- coding: utf-8 -*- +import sys +import io +sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8', errors='replace') +sys.path.insert(0, 'c:\\Users\\청춘약국\\source\\pharmacy-pos-qr-system\\backend') + +from db.dbsetup import get_db_session +from sqlalchemy import text + +session = get_db_session('PM_DRUG') + +print('=== CD_ITEM_UNIT_MEMBER 테이블 구조 ===\n') +result = session.execute(text(""" + SELECT COLUMN_NAME, DATA_TYPE + FROM INFORMATION_SCHEMA.COLUMNS + WHERE TABLE_NAME = 'CD_ITEM_UNIT_MEMBER' + ORDER BY ORDINAL_POSITION +""")) +for row in result: + print(f' {row.COLUMN_NAME}: {row.DATA_TYPE}') + +print('\n=== 관계 확인: 안텔민킹 ===\n') + +# CD_GOODS +print('1. CD_GOODS:') +result = session.execute(text(""" + SELECT DrugCode, GoodsName, BARCODE + FROM CD_GOODS WHERE DrugCode = 'LB000003157' +""")) +for row in result: + print(f' DrugCode: {row.DrugCode}') + print(f' GoodsName: {row.GoodsName}') + print(f' BARCODE: [{row.BARCODE}]') + +# CD_SALEGOODS +print('\n2. CD_SALEGOODS:') +result = session.execute(text(""" + SELECT DrugCode, GoodsName, BARCODE + FROM CD_SALEGOODS WHERE DrugCode = 'LB000003157' +""")) +for row in result: + print(f' DrugCode: {row.DrugCode}') + print(f' BARCODE: [{row.BARCODE}]') + +# CD_ITEM_UNIT_MEMBER +print('\n3. CD_ITEM_UNIT_MEMBER:') +result = session.execute(text(""" + SELECT DRUGCODE, CD_CD_UNIT, CD_CD_BARCODE, CHANGE_DATE + FROM CD_ITEM_UNIT_MEMBER + WHERE DRUGCODE = 'LB000003157' + ORDER BY SN DESC +""")) +for row in result: + print(f' DRUGCODE: {row.DRUGCODE} | UNIT: {row.CD_CD_UNIT} | BARCODE: {row.CD_CD_BARCODE} | DATE: {row.CHANGE_DATE}') + +# CD_SALEGOODS.BARCODE 와 CD_ITEM_UNIT_MEMBER.CD_CD_BARCODE 비교 +print('\n=== 다른 제품으로 관계 확인 (안텔민) ===\n') +result = session.execute(text(""" + SELECT + g.DrugCode, + g.GoodsName, + s.BARCODE as SALE_BARCODE, + u.CD_CD_BARCODE as UNIT_BARCODE, + u.CD_CD_UNIT + FROM CD_GOODS g + LEFT JOIN CD_SALEGOODS s ON g.DrugCode = s.DrugCode + LEFT JOIN CD_ITEM_UNIT_MEMBER u ON g.DrugCode = u.DRUGCODE + WHERE g.GoodsName LIKE N'%안텔민%' + ORDER BY g.DrugCode, u.SN DESC +""")) + +current_drug = None +for row in result: + if row.DrugCode != current_drug: + print(f'\n{row.DrugCode}: {row.GoodsName}') + print(f' CD_SALEGOODS.BARCODE: {row.SALE_BARCODE}') + current_drug = row.DrugCode + print(f' └ CD_ITEM_UNIT_MEMBER: {row.UNIT_BARCODE} (UNIT: {row.CD_CD_UNIT})') + +session.close() diff --git a/backend/scripts/compare_tables.py b/backend/scripts/compare_tables.py new file mode 100644 index 0000000..aae6e19 --- /dev/null +++ b/backend/scripts/compare_tables.py @@ -0,0 +1,64 @@ +# -*- coding: utf-8 -*- +import sys +import io +sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8', errors='replace') +sys.path.insert(0, 'c:\\Users\\청춘약국\\source\\pharmacy-pos-qr-system\\backend') + +from db.dbsetup import get_db_session +from sqlalchemy import text + +session = get_db_session('PM_DRUG') + +print('=== 테이블별 레코드 수 ===\n') + +tables = ['CD_GOODS', 'CD_SALEGOODS', 'CD_BARCODE'] +for tbl in tables: + result = session.execute(text(f"SELECT COUNT(*) as cnt FROM {tbl}")) + cnt = result.fetchone().cnt + print(f'{tbl}: {cnt:,}개') + +print('\n=== 안텔민 비교 (CD_GOODS vs CD_SALEGOODS) ===\n') + +# CD_GOODS +print('CD_GOODS:') +result = session.execute(text(""" + SELECT DrugCode, GoodsName, BARCODE + FROM CD_GOODS + WHERE GoodsName LIKE N'%안텔민%' +""")) +for row in result: + print(f' {row.DrugCode}: {row.GoodsName} | BARCODE: [{row.BARCODE}]') + +# CD_SALEGOODS +print('\nCD_SALEGOODS:') +result2 = session.execute(text(""" + SELECT DrugCode, GoodsName, BARCODE + FROM CD_SALEGOODS + WHERE GoodsName LIKE N'%안텔민%' +""")) +for row in result2: + print(f' {row.DrugCode}: {row.GoodsName} | BARCODE: [{row.BARCODE}]') + +# CD_BARCODE +print('\nCD_BARCODE (안텔민 관련):') +result3 = session.execute(text(""" + SELECT DRUGCODE, BARCODE, ETCNAME + FROM CD_BARCODE + WHERE ETCNAME LIKE N'%안텔민%' +""")) +rows = list(result3) +if rows: + for row in rows: + print(f' {row.DRUGCODE}: {row.ETCNAME} | BARCODE: [{row.BARCODE}]') +else: + print(' (없음 - 동물약은 CD_BARCODE에 없음)') + +print('\n=== CD_BARCODE는 어떤 용도? (샘플) ===\n') +result4 = session.execute(text(""" + SELECT TOP 5 DRUGCODE, BARCODE, ETCNAME, CL_GUBUN + FROM CD_BARCODE +""")) +for row in result4: + print(f' {row.DRUGCODE}: {row.ETCNAME} | {row.CL_GUBUN}') + +session.close() diff --git a/backend/scripts/find_apc.py b/backend/scripts/find_apc.py new file mode 100644 index 0000000..434824f --- /dev/null +++ b/backend/scripts/find_apc.py @@ -0,0 +1,26 @@ +# -*- coding: utf-8 -*- +import sys +import io +sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8', errors='replace') + +from sqlalchemy import create_engine, text + +conn = create_engine('postgresql://admin:trajet6640@192.168.0.87:5432/apdb_master').connect() + +# 안텔민 뽀삐 10정 검색 +result = conn.execute(text(""" + SELECT apc, product_name, image_url1, godoimage_url_f + FROM apc + WHERE product_name ILIKE '%안텔민%뽀삐%' + AND product_name ILIKE '%10 정%' +""")) + +print('=== 안텔민 뽀삐 정 10정 APC ===\n') +for row in result: + print(f'★ APC: {row.apc}') + print(f' 제품명: {row.product_name}') + print(f' 이미지: {row.image_url1}') + print(f' 고도몰: {row.godoimage_url_f}') + print() + +conn.close() diff --git a/backend/scripts/find_barcode_tables.py b/backend/scripts/find_barcode_tables.py new file mode 100644 index 0000000..b6dd66c --- /dev/null +++ b/backend/scripts/find_barcode_tables.py @@ -0,0 +1,53 @@ +# -*- coding: utf-8 -*- +import sys +import io +sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8', errors='replace') +sys.path.insert(0, 'c:\\Users\\청춘약국\\source\\pharmacy-pos-qr-system\\backend') + +from db.dbsetup import get_db_session +from sqlalchemy import text + +session = get_db_session('PM_DRUG') + +print('=== PM_DRUG 전체 테이블 목록 ===\n') + +result = session.execute(text(""" + SELECT TABLE_NAME + FROM INFORMATION_SCHEMA.TABLES + WHERE TABLE_TYPE = 'BASE TABLE' + ORDER BY TABLE_NAME +""")) + +for row in result: + print(row.TABLE_NAME) + +print('\n=== BARCODE 관련 컬럼이 있는 테이블 ===\n') + +result2 = session.execute(text(""" + SELECT TABLE_NAME, COLUMN_NAME + FROM INFORMATION_SCHEMA.COLUMNS + WHERE COLUMN_NAME LIKE '%BARCODE%' OR COLUMN_NAME LIKE '%BAR%' + ORDER BY TABLE_NAME +""")) + +for row in result2: + print(f'{row.TABLE_NAME}.{row.COLUMN_NAME}') + +print('\n=== LB000003157 이 들어있는 테이블 찾기 ===\n') + +# 주요 테이블들에서 검색 +tables_to_check = ['CD_GOODS', 'CD_BARCODE', 'CD_ETCGOODS', 'TEMP_ETCGOODS'] + +for tbl in tables_to_check: + try: + result = session.execute(text(f""" + SELECT TOP 1 * FROM {tbl} WHERE DrugCode = 'LB000003157' OR DRUGCODE = 'LB000003157' + """)) + row = result.fetchone() + if row: + print(f'★ {tbl}: 발견!') + print(f' {dict(row._mapping)}') + except Exception as e: + pass + +session.close() diff --git a/backend/scripts/find_recent.py b/backend/scripts/find_recent.py new file mode 100644 index 0000000..5669b82 --- /dev/null +++ b/backend/scripts/find_recent.py @@ -0,0 +1,85 @@ +# -*- coding: utf-8 -*- +import sys +import io +sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8', errors='replace') +sys.path.insert(0, 'c:\\Users\\청춘약국\\source\\pharmacy-pos-qr-system\\backend') + +from db.dbsetup import get_db_session +from sqlalchemy import text + +session = get_db_session('PM_DRUG') + +print('=' * 60) +print('=== 1. CD_BARCODE 최근 추가된 행 (상위 20개) ===') +print('=' * 60) + +# ACTDATE가 최근인 것들 +result = session.execute(text(""" + SELECT TOP 20 DRUGCODE, BARCODE, BASECODE, ETCNAME, ACTDATE + FROM CD_BARCODE + ORDER BY ACTDATE DESC +""")) + +for row in result: + print(f'{row.ACTDATE} | {row.DRUGCODE} | {row.BARCODE} | {row.ETCNAME}') + +print('\n' + '=' * 60) +print('=== 2. CD_BARCODE에서 "안텔민" 포함 (ETCNAME) ===') +print('=' * 60) + +result2 = session.execute(text(""" + SELECT DRUGCODE, BARCODE, BASECODE, ETCNAME + FROM CD_BARCODE + WHERE ETCNAME LIKE N'%안텔민%' +""")) + +rows = list(result2) +if rows: + for row in rows: + print(f'{row.DRUGCODE} | {row.BARCODE} | {row.ETCNAME}') +else: + print('(없음)') + +print('\n' + '=' * 60) +print('=== 3. CD_GOODS에서 안텔민 BARCODE 확인 ===') +print('=' * 60) + +result3 = session.execute(text(""" + SELECT DrugCode, GoodsName, BARCODE + FROM CD_GOODS + WHERE GoodsName LIKE N'%안텔민%' +""")) + +for row in result3: + print(f'{row.DrugCode} | {row.GoodsName} | BARCODE: [{row.BARCODE}]') + +print('\n' + '=' * 60) +print('=== 4. 0230237 로 시작하는 바코드 검색 ===') +print('=' * 60) + +result4 = session.execute(text(""" + SELECT DRUGCODE, BARCODE, ETCNAME + FROM CD_BARCODE + WHERE BARCODE LIKE '0230237%' +""")) + +rows = list(result4) +if rows: + for row in rows: + print(f'{row.DRUGCODE} | {row.BARCODE} | {row.ETCNAME}') +else: + print('(없음)') + +# CD_GOODS에서도 +result5 = session.execute(text(""" + SELECT DrugCode, GoodsName, BARCODE + FROM CD_GOODS + WHERE BARCODE LIKE '0230237%' +""")) + +rows = list(result5) +if rows: + for row in rows: + print(f'{row.DrugCode} | {row.GoodsName} | {row.BARCODE}') + +session.close() diff --git a/backend/scripts/query_aniparm.py b/backend/scripts/query_aniparm.py new file mode 100644 index 0000000..eaff783 --- /dev/null +++ b/backend/scripts/query_aniparm.py @@ -0,0 +1,168 @@ +# -*- coding: utf-8 -*- +""" +애니팜 PostgreSQL 조회 스크립트 +Usage: + python scripts/query_aniparm.py schema # 테이블 구조 확인 + python scripts/query_aniparm.py search <제품명> # 제품 검색 + python scripts/query_aniparm.py barcode <바코드> # 바코드로 검색 + python scripts/query_aniparm.py sample # 샘플 데이터 + python scripts/query_aniparm.py stats # 통계 +""" +import sys +import io +import json + +# ═══════════════════════════════════════════════════════════ +# 인코딩 설정 (Windows CP949 문제 방지) +# ═══════════════════════════════════════════════════════════ +sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8', errors='replace') +sys.stderr = io.TextIOWrapper(sys.stderr.buffer, encoding='utf-8', errors='replace') +from sqlalchemy import create_engine, text + +# PostgreSQL 연결 +DATABASE_URI = 'postgresql://admin:trajet6640@192.168.0.87:5432/apdb_master' + +def get_connection(): + engine = create_engine(DATABASE_URI) + return engine.connect() + +def cmd_schema(): + """apc 테이블 구조 확인""" + conn = get_connection() + result = conn.execute(text(""" + SELECT column_name, data_type, character_maximum_length + FROM information_schema.columns + WHERE table_name = 'apc' + ORDER BY ordinal_position + """)) + + print('=== apc 테이블 컬럼 ===') + for row in result: + length = f'({row.character_maximum_length})' if row.character_maximum_length else '' + print(f' {row.column_name}: {row.data_type}{length}') + + conn.close() + +def cmd_search(keyword): + """제품명으로 검색""" + conn = get_connection() + result = conn.execute(text(""" + SELECT idx, apc, product_name, company_name, + image_url1, godoimage_url_f, for_pets + FROM apc + WHERE product_name ILIKE :keyword + LIMIT 20 + """), {'keyword': f'%{keyword}%'}) + + print(f'=== "{keyword}" 검색 결과 ===') + count = 0 + for row in result: + count += 1 + print(f'\n[{count}] {row.product_name}') + print(f' APC: {row.apc}') + print(f' 제조사: {row.company_name}') + print(f' 동물용: {row.for_pets}') + if row.image_url1: + print(f' 이미지1: {row.image_url1[:50]}...') + if row.godoimage_url_f: + print(f' 고도몰F: {row.godoimage_url_f[:50]}...') + + if count == 0: + print('(결과 없음)') + + conn.close() + +def cmd_barcode(barcode): + """바코드로 검색 - 바코드 컬럼이 있는지 먼저 확인""" + conn = get_connection() + + # 바코드 관련 컬럼 찾기 + result = conn.execute(text(""" + SELECT column_name FROM information_schema.columns + WHERE table_name = 'apc' + AND column_name ILIKE '%barcode%' + """)) + + barcode_cols = [row.column_name for row in result] + + if not barcode_cols: + print('apc 테이블에 barcode 관련 컬럼이 없습니다.') + print('다른 컬럼으로 검색해야 합니다.') + else: + print(f'바코드 컬럼 발견: {barcode_cols}') + # TODO: 바코드로 검색 구현 + + conn.close() + +def cmd_sample(): + """샘플 데이터 (동물용 제품)""" + conn = get_connection() + result = conn.execute(text(""" + SELECT idx, apc, product_name, company_name, + image_url1, godoimage_url_f, for_pets + FROM apc + WHERE for_pets = true + LIMIT 10 + """)) + + print('=== 동물용 제품 샘플 ===') + count = 0 + for row in result: + count += 1 + print(f'\n[{count}] {row.product_name}') + print(f' APC: {row.apc}') + print(f' 제조사: {row.company_name}') + img = row.image_url1 or row.godoimage_url_f or '(없음)' + if len(img) > 50: + img = img[:50] + '...' + print(f' 이미지: {img}') + + if count == 0: + print('(동물용 제품 없음 - for_pets 필터 확인 필요)') + + conn.close() + +def cmd_stats(): + """통계""" + conn = get_connection() + + result = conn.execute(text(""" + SELECT + COUNT(*) as total, + SUM(CASE WHEN for_pets = true THEN 1 ELSE 0 END) as pet_count, + SUM(CASE WHEN image_url1 IS NOT NULL AND image_url1 != '' THEN 1 ELSE 0 END) as has_img1, + SUM(CASE WHEN godoimage_url_f IS NOT NULL AND godoimage_url_f != '' THEN 1 ELSE 0 END) as has_godo_f + FROM apc + """)) + + row = result.fetchone() + print('=== apc 테이블 통계 ===') + print(f'전체 제품: {row.total:,}개') + print(f'동물용(for_pets=true): {row.pet_count:,}개') + print(f'image_url1 있음: {row.has_img1:,}개') + print(f'godoimage_url_f 있음: {row.has_godo_f:,}개') + + conn.close() + +def main(): + if len(sys.argv) < 2: + print(__doc__) + return + + cmd = sys.argv[1] + + if cmd == 'schema': + cmd_schema() + elif cmd == 'search' and len(sys.argv) > 2: + cmd_search(sys.argv[2]) + elif cmd == 'barcode' and len(sys.argv) > 2: + cmd_barcode(sys.argv[2]) + elif cmd == 'sample': + cmd_sample() + elif cmd == 'stats': + cmd_stats() + else: + print(__doc__) + +if __name__ == '__main__': + main() diff --git a/backend/scripts/search_apc_everywhere.py b/backend/scripts/search_apc_everywhere.py new file mode 100644 index 0000000..5169946 --- /dev/null +++ b/backend/scripts/search_apc_everywhere.py @@ -0,0 +1,57 @@ +# -*- coding: utf-8 -*- +import sys +import io +sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8', errors='replace') +sys.path.insert(0, 'c:\\Users\\청춘약국\\source\\pharmacy-pos-qr-system\\backend') + +from db.dbsetup import get_db_session +from sqlalchemy import text + +apc = '0230237010107' + +for db_name in ['PM_DRUG', 'PM_PRES', 'PM_BASE']: + print(f'\n{"="*60}') + print(f'=== {db_name} 데이터베이스에서 "{apc}" 검색 ===') + print(f'{"="*60}') + + try: + session = get_db_session(db_name) + + # 모든 테이블에서 해당 값 검색 + tables = session.execute(text(""" + SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES + WHERE TABLE_TYPE = 'BASE TABLE' + """)) + + for table_row in tables: + table_name = table_row.TABLE_NAME + + # 각 테이블의 문자열 컬럼에서 검색 + try: + columns = session.execute(text(f""" + SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS + WHERE TABLE_NAME = '{table_name}' + AND DATA_TYPE IN ('varchar', 'nvarchar', 'char', 'nchar', 'text') + """)) + + for col_row in columns: + col_name = col_row.COLUMN_NAME + try: + result = session.execute(text(f""" + SELECT TOP 1 * FROM [{table_name}] + WHERE [{col_name}] = '{apc}' + """)) + row = result.fetchone() + if row: + print(f'\n★ 발견! {table_name}.{col_name}') + print(f' 레코드: {dict(row._mapping)}') + except: + pass + except: + pass + + session.close() + except Exception as e: + print(f'Error: {e}') + +print('\n검색 완료!') diff --git a/backend/scripts/search_mssql.py b/backend/scripts/search_mssql.py new file mode 100644 index 0000000..0214f55 --- /dev/null +++ b/backend/scripts/search_mssql.py @@ -0,0 +1,30 @@ +# -*- coding: utf-8 -*- +import sys +import io + +# ═══════════════════════════════════════════════════════════ +# 인코딩 설정 (Windows CP949 문제 방지) +# ═══════════════════════════════════════════════════════════ +sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8', errors='replace') +sys.stderr = io.TextIOWrapper(sys.stderr.buffer, encoding='utf-8', errors='replace') + +sys.path.insert(0, 'c:\\Users\\청춘약국\\source\\pharmacy-pos-qr-system\\backend') + +from db.dbsetup import get_db_session +from sqlalchemy import text + +keyword = sys.argv[1] if len(sys.argv) > 1 else '안텔민' + +session = get_db_session('PM_DRUG') +result = session.execute(text(f""" + SELECT DrugCode, GoodsName, BARCODE + FROM CD_GOODS + WHERE GoodsName LIKE N'%{keyword}%' +""")) + +print(f'=== MSSQL "{keyword}" 검색 ===') +for row in result: + bc = row.BARCODE if row.BARCODE else '(없음)' + print(f'{row.DrugCode}: {row.GoodsName} | 바코드: {bc}') + +session.close()