다른 AI가 로컬 BLOB(DrugImg) 매칭키에서 막힌 부분을, 운영 POS에
실제 구현·검증한 약정원 JSON API 경로로 보강. 혼동 방지용 결정 문서.
- docs/healthkr-json-api-SOLVED.md: 정답 경로 단일 진입점.
· 연결고리 = CD_GOODS.BARCODE → CD_BARCODE.DIK_CODE (CD_GOODS.DIK
직접 14/19, 바코드 경로 18/19. 용각산(대) 실증).
· 정답 엔드포인트 = ajax_result_drug2.asp (JSON 64필드+이미지URL).
result_drug_simple.asp는 사람용 HTML, zoom.asp 파싱 불필요.
· 로컬 BLOB 안 씀 → 44자 base64 image key 문제 자체가 사라짐.
- README: 핵심결론 최상단에 SOLVED 문서 포인터.
- scripts/probe_healthkr_json.py: 정답 경로 재현 스크립트(비번 CHANGEME).
기존 drugimg-key-findings.md(BLOB 분석)는 보존 — "BLOB 쓸 때의 문제"로
관계 명시.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
97 lines
3.7 KiB
Markdown
97 lines
3.7 KiB
Markdown
# PIT3000 의약품정보/API·이미지 흐름 Reverse Engineering Notes
|
|
|
|
PIT3000/PM2000V6에서 확인한 **의약품 상세정보, 식별 이미지, 약품 이미지, pictogram** 관련 SQL/API 흐름을 정리한 저장소입니다.
|
|
|
|
## 핵심 결론
|
|
|
|
> ★**이미지/약품정보를 실제로 가져오려면 [docs/healthkr-json-api-SOLVED.md](docs/healthkr-json-api-SOLVED.md) 를 보세요.**
|
|
> 로컬 BLOB(`PM_IMAGE..DrugImg`) 매칭키 분석은 막혔지만, **약학정보원 JSON API**로 평문 DIK_CODE로 안정 해결됨(운영 POS 반영).
|
|
> 정답 경로 = `CD_GOODS.BARCODE → CD_BARCODE.DIK_CODE → ajax_result_drug2.asp(JSON)`. CD_GOODS.DIK_CODE 직접·로컬 BLOB은 함정.
|
|
|
|
0. **(권장 경로)** 약품 이미지·상세는 로컬 BLOB이 아니라 **약학정보원 JSON API**에서 받는다. 위 SOLVED 문서 참조.
|
|
1. 화면/인쇄에 쓰이는 약품 상세정보는 로컬 DB(`PM_DRUG`, `PM_IMAGE`)와 외부 health.kr URL을 병행합니다.
|
|
2. `DRUGCODE`에서 `DIK_CODE`, `SUNG_CODE`를 조회합니다.
|
|
3. `SUNG_CODE`는 **성분코드**입니다. 보험코드가 아닙니다.
|
|
4. 식별/약품 이미지는 `PM_IMAGE..DrugImg`, `C:\\Dik20\\Data\\Drugimg2005.MDB`, `C:\\Dik2004\\Data\\Drugimg.MDB` 계열에서 확인됩니다.
|
|
5. `PM_IMAGE..DrugImg.DIK_CODE`는 일부 인스턴스에서 평문 13자리 DIK_CODE가 아니라 44자 Base64/32-byte digest 형태의 image key일 수 있습니다. 직접 join을 단정하면 안 됩니다.
|
|
6. health.kr URL은 상세 페이지/확대 이미지 페이지를 여는 보조 경로입니다. `zoom.asp` 내부에 보이는 이미지 URL도 실제 HTTP 200/JPEG인지 별도 검증해야 합니다.
|
|
|
|
## 확인된 외부 URL
|
|
|
|
```text
|
|
https://health.kr/searchDrug/result_drug_simple.asp?drug_cd={DIK_CODE}
|
|
https://www.health.kr/drug_info/sb/zoom.asp?drug_code={DIK_CODE}&print_front={PRINT_FRONT}&print_back={PRINT_BACK}
|
|
https://www.pharm.or.kr/search/zoom.asp?drug_code={DIK_CODE}
|
|
```
|
|
|
|
## 확인된 주요 SQL
|
|
|
|
```sql
|
|
-- DRUGCODE → DIK_CODE / SUNG_CODE
|
|
SELECT ISNULL(DIK_CODE, '') AS DIK_CODE, SUNG_CODE
|
|
FROM PM_DRUG..CD_GOODS
|
|
WHERE DRUGCODE = :drugcode;
|
|
|
|
-- 약품 상세정보
|
|
SELECT
|
|
A.ETCNAME,
|
|
A.SPLNAME,
|
|
C.SUNG_ENM,
|
|
B.PRINT_TYPE,
|
|
A.EFFCTNAME,
|
|
B.CHARACT,
|
|
B.SAVE_MEDI,
|
|
B.INDIC_MEDI,
|
|
B.EFFECT,
|
|
B.ADR,
|
|
B.INTERACTION,
|
|
B.GEN_MEDI
|
|
FROM PM_DRUG..CD_ETCGOODS AS A
|
|
INNER JOIN PM_DRUG..CD_MC AS B
|
|
ON A.DRUGCODE = B.DRUGCODE
|
|
LEFT JOIN PM_DRUG..CD_SUNG AS C
|
|
ON A.SUNG_CODE = C.SUNG_CODE
|
|
WHERE A.DRUGCODE = :drugcode;
|
|
|
|
-- SQL Server 이미지 테이블
|
|
-- 주의: DrugImg.DIK_CODE는 인스턴스에 따라 평문 DIK_CODE가 아니라 44자 Base64 image key일 수 있음.
|
|
-- 평문 join을 먼저 가정하지 말고 key 분포/DRUGIMG_USER.DRUG_CODE/legacy MDB/PIT 생성 함수를 확인한다.
|
|
SELECT DIK_CODE, DRUG_IMG, EXPR1
|
|
FROM PM_IMAGE..DrugImg
|
|
WHERE DIK_CODE = :image_key
|
|
ORDER BY EXPR1 DESC;
|
|
|
|
-- Access MDB 계열 이미지
|
|
SELECT DRUGCODE, FILENAME, FILELENGTH, DRUGIMG, SEQ
|
|
FROM DRUGIMG
|
|
WHERE DRUGCODE = :drugcode
|
|
ORDER BY SEQ;
|
|
|
|
-- pictogram
|
|
SELECT TOP 3 PIC_CODE
|
|
FROM PM_DRUG..CD_PICTOGRAM_SUB
|
|
WHERE DIK_CODE = :dik_code
|
|
ORDER BY SEQ;
|
|
|
|
SELECT TOP 1 PIC_IMG
|
|
FROM PM_DRUG..CD_PICTOGRAM
|
|
WHERE PIC_CODE = :pic_code
|
|
AND PIC_LAG = '0'
|
|
AND IMG_CODE = '1';
|
|
```
|
|
|
|
## 예시 JSON
|
|
|
|
`examples/drug-info-response.example.json` 참고.
|
|
|
|
## 원본 분석 산출물
|
|
|
|
- `data/teoul_drug_image_api_PM_PharmCharge.txt`
|
|
PM_PharmCharge에서 추출한 문자열/SQL/API URL 히트 요약.
|
|
|
|
## 주의
|
|
|
|
- 이 저장소는 API 계약/흐름 문서화용입니다. 외부 사이트를 과도하게 호출하지 마세요.
|
|
- 실제 환자/처방 데이터는 포함하지 않습니다.
|
|
- 이미지 BLOB은 예시에서는 URL/base64 placeholder로만 둡니다.
|