feat: PMPLUS20(v2) 테이블 매핑 완료 및 쿼리 수정
- config.py: PMPLUS20 서버(192.168.0.201\PMPLUS20) 및 SA 비밀번호 수정 - v2_pmplus20.py: PS_MAIN→TBSID040_03, CD_SUNAB→TBSIR000_01 매핑 적용 - 컬럼 매핑: PRICE_T→TOT_PRICE, PRICE_C→INS_PRICE, PRICE_P→EXE_PRICE 등 - Drug_T4 = NON_DRUG_PRICE + EXP_EXE_PRICE - Holiday = HD_ADD + PRES_TIME_GUBUN 조합 - PreGubun = MPRE_TYPE (차상위 F 별도 처리) - PRES_GUBUN='E' 재고보정 레코드 제외 - PMPLUS20_MIGRATION_GUIDE.md: 전체 매핑 가이드 문서 추가 - app.py: 포트 5060→5050 변경 20260324 기준 검증: 건수/금액/보험별/결제별 일치 확인 PRICE_N(수납) 2건 차이(23,420원)는 비급여 수납 처리 개선에 의한 정상 차이 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -3,14 +3,23 @@
|
||||
PMPLUS20 통계 쿼리 (v2)
|
||||
|
||||
테이블 매핑 (PharmIT3000 → PMPLUS20):
|
||||
- PM_PRES.PS_MAIN → PM_MAIN.TBSIM040_28
|
||||
- PM_PRES.PS_SUB_PHARM → PM_MAIN.TBSIM040_29
|
||||
- PM_PRES.CD_SUNAB → PM_MAIN.TBSIR000_01
|
||||
- PM_DRUG.CD_GOODS → PM_MAIN.TBSIM040_01
|
||||
- PM_PRES.PS_MAIN → PM_MAIN.TBSID040_03 (처방 헤더)
|
||||
- PM_PRES.CD_SUNAB → PM_MAIN.TBSIR000_01 (수납/결제, DRUG_SEQ로 JOIN)
|
||||
|
||||
컬럼 매핑:
|
||||
- PreSerial → DRUG_SEQ
|
||||
- INDATE → SUNAB_DT
|
||||
- PRICE_T → TOT_PRICE, PRICE_C → INS_PRICE, PRICE_P → EXE_PRICE, PRICE_N → REAL_PRICE
|
||||
- S_Prep → INS_PREP_PRICE
|
||||
- Drug_T4 → NON_DRUG_PRICE + EXP_EXE_PRICE
|
||||
- PreGubun → MPRE_TYPE (값 체계 동일: 0,1,9,F 등)
|
||||
- Holiday → HD_ADD + PRES_TIME_GUBUN 조합
|
||||
- Appr_Gubun → APPR_GUBUN (값 동일)
|
||||
- nAPPROVAL_NUM → CARD_ADM_NO
|
||||
|
||||
주의:
|
||||
- DrugCode vs Drug_Code 대소문자 차이
|
||||
- TBSIR000_01.RECP_DT는 datetime (변환 필요)
|
||||
- PRES_GUBUN='E' (재고보정) 레코드 제외 필요
|
||||
- MPRE_TYPE_GUBUN='F'인 경우 PreGubun='F' (차상위)
|
||||
"""
|
||||
import pyodbc
|
||||
from datetime import date
|
||||
@@ -53,36 +62,43 @@ def get_sales_stats(date_from: str, date_to: str) -> dict:
|
||||
dict: {total, by_gubun, by_age, by_time, by_pay, by_hosp}
|
||||
|
||||
Note:
|
||||
컬럼명/테이블명은 실제 PMPLUS20 스키마 확인 후 수정 필요
|
||||
TBSID040_03(처방헤더) + TBSIR000_01(수납) 매핑 확정 (2026-04-01)
|
||||
"""
|
||||
# TODO: 실제 PMPLUS20 스키마 확인 후 쿼리 수정
|
||||
# 현재는 PharmIT3000과 동일한 컬럼명 가정
|
||||
sql = """
|
||||
SELECT
|
||||
m.PreSerial,
|
||||
m.PreGubun,
|
||||
m.PaNum,
|
||||
m.OrderName,
|
||||
m.Holiday,
|
||||
m.PRICE_T,
|
||||
m.Drug_T4,
|
||||
m.S_Prep,
|
||||
m.PRICE_C,
|
||||
m.PRICE_P,
|
||||
m.PRICE_N,
|
||||
ISNULL(n.Appr_Gubun, '') AS Appr_Gubun,
|
||||
ISNULL(n.nAPPROVAL_NUM, '') AS nAPPROVAL_NUM
|
||||
FROM PM_MAIN..TBSIM040_28 m
|
||||
LEFT JOIN PM_MAIN..TBSIR000_01 n ON n.PRESERIAL = m.PreSerial
|
||||
WHERE m.INDATE BETWEEN ? AND ?
|
||||
m.DRUG_SEQ AS PreSerial,
|
||||
CASE
|
||||
WHEN m.MPRE_TYPE_GUBUN = 'F' THEN 'F'
|
||||
ELSE ISNULL(m.MPRE_TYPE, '0')
|
||||
END AS PreGubun,
|
||||
m.PAT_JUMIN_NO AS PaNum,
|
||||
m.YOYANG_NM AS OrderName,
|
||||
CASE
|
||||
WHEN m.HD_ADD = '2' AND m.PRES_TIME_GUBUN = '1' THEN '4'
|
||||
WHEN m.HD_ADD = '2' THEN '2'
|
||||
WHEN m.PRES_TIME_GUBUN = '1' THEN '3'
|
||||
ELSE '1'
|
||||
END AS Holiday,
|
||||
m.TOT_PRICE AS PRICE_T,
|
||||
(ISNULL(m.NON_DRUG_PRICE, 0) + ISNULL(m.EXP_EXE_PRICE, 0)) AS Drug_T4,
|
||||
m.INS_PREP_PRICE AS S_Prep,
|
||||
m.INS_PRICE AS PRICE_C,
|
||||
m.EXE_PRICE AS PRICE_P,
|
||||
m.REAL_PRICE AS PRICE_N,
|
||||
ISNULL(n.APPR_GUBUN, '') AS Appr_Gubun,
|
||||
ISNULL(n.CARD_ADM_NO, '') AS nAPPROVAL_NUM
|
||||
FROM PM_MAIN..TBSID040_03 m
|
||||
LEFT JOIN PM_MAIN..TBSIR000_01 n ON n.DRUG_SEQ = m.DRUG_SEQ
|
||||
WHERE m.SUNAB_DT BETWEEN ? AND ?
|
||||
AND m.PRES_GUBUN != 'E'
|
||||
"""
|
||||
|
||||
|
||||
try:
|
||||
rows = query(sql, (date_from, date_to))
|
||||
except Exception as e:
|
||||
return {
|
||||
'error': str(e),
|
||||
'note': 'PMPLUS20 스키마 확인 필요. 컬럼명/테이블명이 다를 수 있음.'
|
||||
'error': str(e),
|
||||
'note': 'PMPLUS20 쿼리 오류. TBSID040_03/TBSIR000_01 테이블 확인 필요.'
|
||||
}
|
||||
|
||||
ref_date = date(
|
||||
|
||||
Reference in New Issue
Block a user