o2o-infinith-demo/supporters/scripts/template/planner/procedures.plastic.json
Haewon Kam aa5b05227f feat(supporters): 회복 일정 플래너를 템플릿·워커에 통합 (/plan·/en/plan), /recovery·/stay 를 /plan 으로 정리
- 템플릿: Planner.astro, lib/plan.ts·tour.ts, styles/plan.css, planStrings, pages plan·en/plan·404. Base 내비 회복 일정 → /plan, 언어 짝 /plan↔/en/plan, 옛 주소 리다이렉트(vercel.json), 사이트맵
- 워커 planner 단계(recovery 다음): scripts/build_planner_data.mjs 가 업종별 기본 규칙표(scripts/template/planner/procedures.plastic|derm.json)에 병원 시술 페이지 원문(recoveryNotes)을 matchKeywords 로 붙이고, 장소는 briefs/<clinic>/planner.places.json(큐레이션) 또는 범용 기본표(관광공사 기준 좌표)로 만든다
- 브리프: viewclinic·oracle 큐레이션 장소. 빈 템플릿(관광 데이터 없음)도 빌드·검증 통과(plan.test 14건)
- 이전 세션의 미커밋 작업(피부과 수집·OCR·게이트·언어 스위치, stay 페이지 제거)도 이 커밋에 함께 들어감. docs/prd 변경은 제외

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-09-11 11:27:59 +09:00

962 lines
23 KiB
JSON

{
"_comment": "성형외과 기본 규칙표 (뷰성형외과 샘플에서 정리). 워커 planner 단계(scripts/build_planner_data.mjs)가 병원 시술 페이지 원문(recoveryNotes.json)을 matchKeywords 로 시술에 붙여 병원별 procedures.json 을 만든다. clinic 출처가 있는 값은 뷰성형외과 공개 안내이므로 다른 병원에서는 provisional 로 내려간다.",
"clinicSources": [],
"levels": [
{
"level": 0,
"label": {
"ko": "실내 안정",
"en": "Rest indoors"
},
"desc": {
"ko": "병실이나 호텔에서 쉬는 날입니다. 필요한 것은 배달과 룸서비스로 해결합니다.",
"en": "Rest at the hospital or hotel. Use delivery and room service."
}
},
{
"level": 1,
"label": {
"ko": "근거리 외출",
"en": "Short walks"
},
"desc": {
"ko": "호텔 반경 500m 안에서 짧게 다녀옵니다. 도보 10분 이내.",
"en": "Short trips within 500 m of your hotel. Up to a 10-minute walk."
}
},
{
"level": 2,
"label": {
"ko": "반나절 외출",
"en": "Half-day outing"
},
"desc": {
"ko": "택시로 반경 3km 안 쇼핑·식사·가벼운 관광이 가능합니다.",
"en": "Shopping, dining and light sightseeing within 3 km by taxi."
}
},
{
"level": 3,
"label": {
"ko": "자유 외출",
"en": "Full day out"
},
"desc": {
"ko": "하루 단위 외출이 가능합니다. 시내 관광, 행사, 인파가 있는 곳도 담당 원장 안내 안에서 가능합니다.",
"en": "Full-day outings. City sightseeing and events, within your surgeon's guidance."
}
}
],
"diets": {
"liquid": {
"label": {
"ko": "유동식",
"en": "Liquid diet"
},
"desc": {
"ko": "건더기 없는 유동식만 드십니다.",
"en": "Liquids only, no solids."
}
},
"soft": {
"label": {
"ko": "부드러운 음식",
"en": "Soft foods"
},
"desc": {
"ko": "건더기가 있어도 부드러운 음식까지 가능합니다.",
"en": "Soft foods are fine. Avoid anything chewy or hard."
}
},
"mild": {
"label": {
"ko": "자극 없는 일반식",
"en": "Regular, non-spicy"
},
"desc": {
"ko": "맵고 짜거나 딱딱한 음식은 피합니다.",
"en": "Regular meals. Avoid spicy, salty or hard foods."
}
},
"normal": {
"label": {
"ko": "일반식",
"en": "Regular diet"
},
"desc": {
"ko": "식사 제한이 없습니다.",
"en": "No dietary restrictions."
}
}
},
"constraints": {
"no-heavy-lifting": {
"ko": "무거운 짐과 팔을 많이 쓰는 동작을 피합니다. 쇼핑은 배송 서비스를 이용하세요.",
"en": "Avoid heavy bags and arm-heavy movement. Use delivery for shopping."
},
"sports-bra": {
"ko": "스포츠브라를 1~3개월 유지합니다.",
"en": "Wear a sports bra for 1 to 3 months."
},
"no-alcohol-30d": {
"ko": "음주와 흡연은 최소 1개월 이후입니다.",
"en": "No alcohol or smoking for at least 1 month."
},
"no-sauna-60d": {
"ko": "사우나, 찜질방, 수영, 과한 운동은 약 2개월 후입니다.",
"en": "No sauna, spa, swimming or intense exercise for about 2 months."
},
"compression-band": {
"ko": "압박밴드를 2~4주 착용합니다. 취침 시에는 하지 않습니다.",
"en": "Wear the compression band for 2 to 4 weeks, not while sleeping."
},
"sleep-elevated": {
"ko": "머리를 심장보다 높게 하고 정면 자세로 잡니다. 1주 후부터 옆으로 누워도 됩니다.",
"en": "Sleep with your head above heart level, facing up. Side sleeping from week 2."
},
"saline-gargle": {
"ko": "약 1개월간 생리식염수 가글을 꾸준히 합니다.",
"en": "Rinse with saline regularly for about 1 month."
},
"no-hard-food-30d": {
"ko": "질기고 딱딱한 음식은 한 달간 피합니다.",
"en": "Avoid chewy or hard food for 1 month."
},
"no-sun": {
"ko": "직사광선을 피합니다. 모자와 선글라스를 챙기세요.",
"en": "Avoid direct sun. Bring a hat and sunglasses."
},
"mask": {
"ko": "외출 시 마스크를 쓰면 부기와 멍이 덜 보입니다.",
"en": "A mask helps cover swelling and bruising when out."
},
"no-glasses": {
"ko": "안경 착용을 피합니다. 콘택트렌즈나 안경 없이 다닐 계획을 세우세요.",
"en": "Avoid glasses resting on your nose. Plan for contacts or going without."
},
"no-lens": {
"ko": "콘택트렌즈는 담당 원장이 허용할 때까지 쓰지 않습니다.",
"en": "No contact lenses until your surgeon allows."
},
"cold-compress": {
"ko": "초기에는 냉찜질, 이후 온찜질을 합니다.",
"en": "Cold compresses at first, then warm."
},
"no-nose-blow": {
"ko": "코를 세게 풀거나 코 부위에 압력을 주지 않습니다.",
"en": "Do not blow your nose or press on the nose area."
},
"no-massage": {
"ko": "수술 부위 마사지와 강한 압박을 피합니다.",
"en": "No massage or firm pressure on the surgical area."
},
"no-hat-pressure": {
"ko": "이식 부위를 누르는 모자나 헬멧을 피합니다.",
"en": "Avoid hats or helmets that press on the graft area."
},
"no-scratch": {
"ko": "가려워도 긁지 않습니다.",
"en": "Do not scratch, even if itchy."
},
"driving": {
"ko": "수술 당일은 운전할 수 없습니다. 보호자 동반을 권합니다.",
"en": "No driving on surgery day. A companion is recommended."
}
},
"procedures": [
{
"id": "breast",
"label": {
"ko": "가슴성형",
"en": "Breast Augmentation"
},
"group": {
"ko": "가슴",
"en": "Breast"
},
"readMore": null,
"preOpDays": {
"value": 2,
"status": "provisional",
"note": {
"ko": "검진과 상담 1일, 여유 1일",
"en": "1 day for tests and consultation, 1 buffer day"
}
},
"hospitalNights": {
"value": 1,
"status": "provisional"
},
"stitchRemovalDay": {
"value": 7,
"range": [
5,
10
],
"status": "provisional",
"note": {
"ko": "실밥이 있으면 약 1주에 제거. 피부 접착제를 쓴 경우 실밥 없음",
"en": "Stitches, if any, removed at about 1 week. No stitches if skin adhesive was used"
}
},
"earliestDepartureDay": {
"value": 10,
"status": "provisional"
},
"outingLevels": [
{
"fromDay": 0,
"level": 0,
"status": "provisional",
"note": {
"ko": "부기는 2~3일째 가장 심합니다",
"en": "Swelling peaks on days 2 to 3"
}
},
{
"fromDay": 3,
"level": 1,
"status": "provisional",
"note": {
"ko": "3일 이후 붕대를 뗍니다",
"en": "Bandage removed after day 3"
}
},
{
"fromDay": 7,
"level": 2,
"status": "provisional"
},
{
"fromDay": 14,
"level": 3,
"status": "provisional"
}
],
"diet": [
{
"fromDay": 0,
"type": "normal",
"status": "provisional"
}
],
"constraints": [
"driving",
"no-heavy-lifting",
"sports-bra",
"no-alcohol-30d",
"no-sauna-60d"
],
"sources": [],
"matchKeywords": "가슴|유방|보형물|모티바"
},
{
"id": "contour",
"label": {
"ko": "안면윤곽·양악",
"en": "Facial Contouring / Jaw Surgery"
},
"group": {
"ko": "얼굴뼈",
"en": "Facial bone"
},
"readMore": null,
"preOpDays": {
"value": 2,
"status": "provisional",
"note": {
"ko": "3D-CT 촬영과 검진, 상담",
"en": "3D-CT, tests and consultation"
}
},
"hospitalNights": {
"value": 1,
"status": "provisional"
},
"stitchRemovalDay": {
"value": null,
"status": "provisional",
"note": {
"ko": "입안 실은 녹는 실이라 보통 한 달 후 저절로 없어집니다. 별도 제거 방문 없음",
"en": "Intraoral stitches dissolve on their own in about a month. No removal visit"
},
"display": {
"ko": "제거 방문 없음",
"en": "No removal visit"
}
},
"earliestDepartureDay": {
"value": 14,
"status": "provisional"
},
"outingLevels": [
{
"fromDay": 0,
"level": 0,
"status": "provisional",
"note": {
"ko": "부기는 3~4일까지 늘다가 가라앉습니다",
"en": "Swelling increases until day 3 to 4, then subsides"
}
},
{
"fromDay": 5,
"level": 1,
"status": "provisional",
"note": {
"ko": "5~7일 후 일상생활이 가능합니다",
"en": "Daily activities possible after day 5 to 7"
}
},
{
"fromDay": 10,
"level": 2,
"status": "provisional"
},
{
"fromDay": 21,
"level": 3,
"status": "provisional"
}
],
"diet": [
{
"fromDay": 0,
"type": "liquid",
"status": "provisional"
},
{
"fromDay": 7,
"type": "soft",
"status": "provisional"
},
{
"fromDay": 14,
"type": "mild",
"status": "provisional"
},
{
"fromDay": 30,
"type": "normal",
"status": "provisional"
}
],
"constraints": [
"driving",
"compression-band",
"sleep-elevated",
"saline-gargle",
"no-hard-food-30d",
"no-alcohol-30d",
"no-sauna-60d",
"no-massage"
],
"sources": [],
"matchKeywords": "윤곽|양악|사각턱|광대|턱끝|무턱|주걱턱"
},
{
"id": "eye",
"label": {
"ko": "눈성형",
"en": "Eyelid Surgery"
},
"group": {
"ko": "눈",
"en": "Eyes"
},
"readMore": null,
"preOpDays": {
"value": 1,
"status": "provisional"
},
"hospitalNights": {
"value": 0,
"status": "provisional"
},
"stitchRemovalDay": {
"value": 6,
"range": [
5,
7
],
"status": "provisional"
},
"earliestDepartureDay": {
"value": 7,
"status": "provisional"
},
"outingLevels": [
{
"fromDay": 0,
"level": 0,
"status": "provisional"
},
{
"fromDay": 2,
"level": 1,
"status": "provisional"
},
{
"fromDay": 5,
"level": 2,
"status": "provisional"
},
{
"fromDay": 10,
"level": 3,
"status": "provisional"
}
],
"diet": [
{
"fromDay": 0,
"type": "normal",
"status": "provisional"
}
],
"constraints": [
"driving",
"cold-compress",
"no-sun",
"no-lens",
"no-scratch",
"no-alcohol-30d"
],
"sources": [],
"matchKeywords": "눈|쌍꺼풀|매몰|절개|트임|눈매"
},
{
"id": "nose",
"label": {
"ko": "코성형",
"en": "Rhinoplasty"
},
"group": {
"ko": "코",
"en": "Nose"
},
"readMore": null,
"preOpDays": {
"value": 2,
"status": "provisional"
},
"hospitalNights": {
"value": 0,
"status": "provisional"
},
"stitchRemovalDay": {
"value": 7,
"range": [
5,
7
],
"status": "provisional",
"note": {
"ko": "부목과 실밥 제거",
"en": "Splint and stitch removal"
}
},
"earliestDepartureDay": {
"value": 10,
"status": "provisional"
},
"outingLevels": [
{
"fromDay": 0,
"level": 0,
"status": "provisional"
},
{
"fromDay": 3,
"level": 1,
"status": "provisional"
},
{
"fromDay": 7,
"level": 2,
"status": "provisional"
},
{
"fromDay": 14,
"level": 3,
"status": "provisional"
}
],
"diet": [
{
"fromDay": 0,
"type": "mild",
"status": "provisional"
},
{
"fromDay": 14,
"type": "normal",
"status": "provisional"
}
],
"constraints": [
"driving",
"mask",
"no-glasses",
"no-nose-blow",
"no-sun",
"no-alcohol-30d",
"no-sauna-60d"
],
"sources": [],
"matchKeywords": "코|비중격|콧"
},
{
"id": "fat",
"label": {
"ko": "지방성형",
"en": "Liposuction / Fat Grafting"
},
"group": {
"ko": "지방",
"en": "Fat"
},
"readMore": null,
"preOpDays": {
"value": 1,
"status": "provisional"
},
"hospitalNights": {
"value": 0,
"status": "provisional"
},
"stitchRemovalDay": {
"value": 7,
"status": "provisional"
},
"earliestDepartureDay": {
"value": 7,
"status": "provisional"
},
"outingLevels": [
{
"fromDay": 0,
"level": 0,
"status": "provisional"
},
{
"fromDay": 2,
"level": 1,
"status": "provisional"
},
{
"fromDay": 5,
"level": 2,
"status": "provisional"
},
{
"fromDay": 14,
"level": 3,
"status": "provisional"
}
],
"diet": [
{
"fromDay": 0,
"type": "normal",
"status": "provisional"
}
],
"constraints": [
"driving",
"compression-band",
"no-massage",
"no-alcohol-30d",
"no-sauna-60d"
],
"sources": [],
"matchKeywords": "지방|흡입|바디"
},
{
"id": "lifting",
"label": {
"ko": "안티에이징·리프팅",
"en": "Anti-aging / Face Lift"
},
"group": {
"ko": "리프팅",
"en": "Lifting"
},
"readMore": null,
"preOpDays": {
"value": 1,
"status": "provisional"
},
"hospitalNights": {
"value": 0,
"status": "provisional"
},
"stitchRemovalDay": {
"value": 7,
"status": "provisional"
},
"earliestDepartureDay": {
"value": 10,
"status": "provisional"
},
"outingLevels": [
{
"fromDay": 0,
"level": 0,
"status": "provisional"
},
{
"fromDay": 3,
"level": 1,
"status": "provisional"
},
{
"fromDay": 7,
"level": 2,
"status": "provisional"
},
{
"fromDay": 14,
"level": 3,
"status": "provisional"
}
],
"diet": [
{
"fromDay": 0,
"type": "soft",
"status": "provisional"
},
{
"fromDay": 7,
"type": "normal",
"status": "provisional"
}
],
"constraints": [
"driving",
"mask",
"no-massage",
"no-sun",
"no-alcohol-30d",
"no-sauna-60d"
],
"sources": [],
"matchKeywords": "리프팅|거상|주름|안티에이징"
},
{
"id": "skin",
"label": {
"ko": "피부과 시술",
"en": "Dermatology Treatment"
},
"group": {
"ko": "피부",
"en": "Skin"
},
"readMore": null,
"preOpDays": {
"value": 1,
"status": "provisional"
},
"hospitalNights": {
"value": 0,
"status": "provisional"
},
"stitchRemovalDay": {
"value": null,
"status": "provisional",
"note": {
"ko": "실밥 없음",
"en": "No stitches"
},
"display": {
"ko": "제거 방문 없음",
"en": "No removal visit"
}
},
"earliestDepartureDay": {
"value": 2,
"status": "provisional"
},
"outingLevels": [
{
"fromDay": 0,
"level": 1,
"status": "provisional"
},
{
"fromDay": 1,
"level": 2,
"status": "provisional"
},
{
"fromDay": 3,
"level": 3,
"status": "provisional"
}
],
"diet": [
{
"fromDay": 0,
"type": "normal",
"status": "provisional"
}
],
"constraints": [
"no-sun",
"no-sauna-60d"
],
"sources": [],
"matchKeywords": "피부|레이저|보톡스|필러|토닝|색소"
},
{
"id": "hair",
"label": {
"ko": "모발이식",
"en": "Hair Transplant"
},
"group": {
"ko": "모발",
"en": "Hair"
},
"readMore": null,
"preOpDays": {
"value": 1,
"status": "provisional"
},
"hospitalNights": {
"value": 0,
"status": "provisional"
},
"stitchRemovalDay": {
"value": null,
"status": "provisional",
"note": {
"ko": "채취 방식에 따라 다릅니다",
"en": "Depends on the harvesting method"
}
},
"earliestDepartureDay": {
"value": 3,
"status": "provisional"
},
"outingLevels": [
{
"fromDay": 0,
"level": 0,
"status": "provisional"
},
{
"fromDay": 1,
"level": 1,
"status": "provisional"
},
{
"fromDay": 3,
"level": 2,
"status": "provisional"
},
{
"fromDay": 7,
"level": 3,
"status": "provisional"
}
],
"diet": [
{
"fromDay": 0,
"type": "normal",
"status": "provisional"
}
],
"constraints": [
"no-sun",
"no-hat-pressure",
"no-scratch",
"no-alcohol-30d",
"no-sauna-60d"
],
"sources": [],
"matchKeywords": "모발|탈모"
}
],
"nationalities": {
"_comment": "무비자 체류 한도(일). 2026-09 기준 확인 필요. null 은 사전 비자 필요. 화면은 항상 대한민국 비자포털 링크와 함께 보여준다.",
"portal": "https://www.visa.go.kr",
"list": [
{
"code": "US",
"label": {
"ko": "미국",
"en": "United States"
},
"visaFreeDays": 90,
"longHaul": true
},
{
"code": "CA",
"label": {
"ko": "캐나다",
"en": "Canada"
},
"visaFreeDays": 180,
"longHaul": true
},
{
"code": "GB",
"label": {
"ko": "영국",
"en": "United Kingdom"
},
"visaFreeDays": 180,
"longHaul": true
},
{
"code": "AU",
"label": {
"ko": "호주",
"en": "Australia"
},
"visaFreeDays": 90,
"longHaul": true
},
{
"code": "JP",
"label": {
"ko": "일본",
"en": "Japan"
},
"visaFreeDays": 90,
"longHaul": false
},
{
"code": "TW",
"label": {
"ko": "대만",
"en": "Taiwan"
},
"visaFreeDays": 90,
"longHaul": false
},
{
"code": "HK",
"label": {
"ko": "홍콩",
"en": "Hong Kong"
},
"visaFreeDays": 90,
"longHaul": false
},
{
"code": "SG",
"label": {
"ko": "싱가포르",
"en": "Singapore"
},
"visaFreeDays": 90,
"longHaul": false
},
{
"code": "TH",
"label": {
"ko": "태국",
"en": "Thailand"
},
"visaFreeDays": 90,
"longHaul": false
},
{
"code": "MY",
"label": {
"ko": "말레이시아",
"en": "Malaysia"
},
"visaFreeDays": 90,
"longHaul": false
},
{
"code": "AE",
"label": {
"ko": "아랍에미리트",
"en": "United Arab Emirates"
},
"visaFreeDays": 90,
"longHaul": true
},
{
"code": "RU",
"label": {
"ko": "러시아",
"en": "Russia"
},
"visaFreeDays": 60,
"longHaul": true
},
{
"code": "KZ",
"label": {
"ko": "카자흐스탄",
"en": "Kazakhstan"
},
"visaFreeDays": 30,
"longHaul": true
},
{
"code": "CN",
"label": {
"ko": "중국",
"en": "China"
},
"visaFreeDays": null,
"longHaul": false
},
{
"code": "VN",
"label": {
"ko": "베트남",
"en": "Vietnam"
},
"visaFreeDays": null,
"longHaul": false
},
{
"code": "ID",
"label": {
"ko": "인도네시아",
"en": "Indonesia"
},
"visaFreeDays": null,
"longHaul": false
},
{
"code": "PH",
"label": {
"ko": "필리핀",
"en": "Philippines"
},
"visaFreeDays": null,
"longHaul": false
},
{
"code": "MN",
"label": {
"ko": "몽골",
"en": "Mongolia"
},
"visaFreeDays": null,
"longHaul": false
},
{
"code": "OTHER",
"label": {
"ko": "그 외",
"en": "Other"
},
"visaFreeDays": null,
"longHaul": true
}
]
}
}