devorah-ai-2016 commited on
Commit
35f06e1
Β·
verified Β·
1 Parent(s): 9ba0326

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +73 -63
app.py CHANGED
@@ -5,11 +5,12 @@ from openpyxl.utils import get_column_letter
5
  from io import BytesIO
6
  from datetime import date, time
7
  import sqlite3
 
8
 
9
  st.set_page_config(page_title="λ°©λ¬Έλͺ©μš• μˆ˜κΈ‰μž 상담일지 μžλ™μƒμ„±κΈ°", layout="wide")
10
 
11
- st.title("πŸ› λ°©λ¬Έλͺ©μš• μˆ˜κΈ‰μž 상담일지 μžλ™μƒμ„±κΈ° v1")
12
- st.caption("μƒλ‹΄μ˜μ—­ β†’ λ¬Έμ œμƒν™© β†’ 원인 β†’ 쑰치 β†’ κΈ‰μ—¬λ°˜μ˜ β†’ μ—‘μ…€ λ‹€μš΄λ‘œλ“œ")
13
  st.warning("⚠️ **β€» λ³Έ μƒμ„±κΈ°λŠ” ν•˜λ£¨ 2회 이용 ν•œλ„ μ œν•œμ΄ μžˆμŠ΅λ‹ˆλ‹€.**")
14
 
15
  DB_FILE = "usage.db"
@@ -98,31 +99,42 @@ REQUIRED_ITEMS = [
98
  "μƒλ‹΄μž μ„œλͺ…", "λŒ€μƒμž λ˜λŠ” 보호자 μ„œλͺ…"
99
  ]
100
 
 
101
  AREA_DATA = {
102
  "λͺ©μš• κ±°λΆ€/ν˜‘μ‘°λ„": {
103
  "problems": ["λͺ©μš• κ±°λΆ€", "νƒˆμ˜ κ±°λΆ€", "물에 λŒ€ν•œ 곡포심", "ν”ΌλΆ€ 접촉 예민", "ν”Όλ‘œκ° ν˜Έμ†Œ", "μƒ€μ›ŒκΈ° μ†Œλ¦¬μ— λΆˆμ•ˆ"],
104
- "causes": ["치맀 인지 μ €ν•˜", "μΆ”μœ„μ— 민감함", "κ³Όκ±° 뢀정적 κ²½ν—˜", "신체 λ…ΈμΆœ μˆ˜μΉ˜μ‹¬", "ν”ΌλΆ€ 건쑰 및 가렀움", "μ»¨λ””μ…˜ μ €ν•˜"],
105
- "actions": ["λ”°λœ»ν•œ μ‹€λ‚΄ μ˜¨λ„ μœ μ§€", "μΆ©λΆ„ν•œ 지지적 λŒ€ν™”", "νƒ€μ›”λ‘œ λͺΈμ„ 감싼 채 μ§„ν–‰", "μ„ ν˜Έν•˜λŠ” μŒμ•… ν‹€κΈ°", "κ°„ν˜Έμ‚¬ 곡유", "보호자 μ•ˆλ‚΄"],
106
  },
107
  "ν”ΌλΆ€ μƒνƒœ/발적/μƒμ²˜": {
108
- "problems": ["ν”ΌλΆ€ 건쑰", "엉덩이 발적", "가렀움증 ν˜Έμ†Œ", "ν”ΌλΆ€ 짓무름", "λ―Έμ„Έ 찰과상", "각질 심화"],
109
- "causes": ["ν˜ˆμ•‘ μˆœν™˜ μ €ν•˜", "μ˜€λž«λ™μ•ˆ μ•‰μ•„μžˆμŒ", "κΈ°μ €κ·€ μž₯κΈ° 착용", "μˆ˜λΆ„ μ„­μ·¨ λΆ€μ‘±", "ν”ΌλΆ€ μž₯λ²½ μ•½ν™”"],
110
- "actions": ["λͺ©μš• ν›„ 보슡제 도포", "λ§ˆμ‚¬μ§€ 도움", "ν”ΌλΆ€ μœ μ‹¬νžˆ κ΄€μ°° 및 기둝", "κ°„ν˜Έμ‚¬/보호자 보고", "κΈ°μ €κ·€ ꡐ체 μ£ΌκΈ° 단좕 κ²€ν† ", "건쑰 κΈ°λŠ₯ κ°•ν™”"],
111
  },
112
  "체온/λ°”μ΄νƒˆ λ³€ν™”": {
113
- "problems": ["λͺ©μš• μ „ν›„ ν˜ˆμ•• μƒμŠΉ", "λͺ©μš• ν›„ ν•œκΈ° ν˜Έμ†Œ", "λ―Έμ—΄ λ°œμƒ", "μ–΄μ§€λŸ¬μ›€ ν˜Έμ†Œ", "κΈ‰κ²©ν•œ ν”Όλ‘œκ°"],
114
- "causes": ["μ‹€λ‚΄μ™Έ μ˜¨λ„μ°¨", "μˆ˜λΆ„ 손싀", "체λ ₯ μ†Œλͺ¨", "온수 자극", "κΈ°μ € 건강 μƒνƒœ"],
115
- "actions": ["λͺ©μš• μ‹œκ°„ 단좕(20~30λΆ„ 이내)", "λͺ©μš• ν›„ λ”°λœ»ν•œ 음료 제곡", "체온 μƒμ‹œ μΈ‘μ •", "κ°„ν˜Έμ‚¬ 보고 및 μ‘κΈ‰μ‘°μΉ˜ μ€€λΉ„", "보호자 상담"],
116
  },
117
  "낙상/이동 λΆˆμ•ˆμ •": {
118
- "problems": ["λ―Έλ„λŸ¬μš΄ λ°”λ‹₯ μœ„ν—˜", "μš•μ‘° μΆœμž… μ‹œ κ· ν˜• 상싀", "λΆ€μΆ• μ‹œ 체쀑 μ‹€λ¦Ό", "νœ μ²΄μ–΄ 이동 μ‹œ λΆˆμ•ˆμ •", "기립 μ‹œ μ–΄μ§€λŸ¬μ›€"],
119
- "causes": ["ν•˜μ§€ κ·Όλ ₯ μ•½ν™”", "λ°”λ‹₯ λ¬ΌκΈ° 및 λΉ„λˆ—λ¬Ό", "인지 κΈ°λŠ₯ μ €ν•˜", "이동 보쑰기ꡬ λ―ΈλΉ„"],
120
- "actions": ["λ―Έλ„λŸΌ λ°©μ§€ 맀트 μΆ”κ°€ μ„€μΉ˜", "μ•ˆμ „ μ†μž‘μ΄ ν™œμš© 보쑰", "λͺ©μš• 의자 μƒμ‹œ μ‚¬μš©", "이동 보쑰 인λ ₯ 2인 ν˜‘μ‘°", "μ•ˆμ „ μˆ˜μΉ™ ꡐ윑"],
121
  },
122
  "μœ„μƒ/일반 κ±΄κ°•μƒνƒœ": {
123
- "problems": ["두피 각질/비듬", "μ†λ°œν†± 관리 ν•„μš”", "λ°°μ„€λ¬Ό μ˜€μ—Ό", "ꡬ강 μœ„μƒ λΆˆλŸ‰", "체취 심화"],
124
- "causes": ["κ°œμΈμœ„μƒ 관리 λΆ€μ‘±", "인지 μ €ν•˜λ‘œ μœ„μƒ κ±°λΆ€", "신체 λ™μž‘ λ²”μœ„ μ œν•œ"],
125
- "actions": ["두피 집쀑 μ„Έμ •", "λͺ©μš• ν›„ μ†λ°œν†± 정리", "μœ„μƒ κ°€μ΄λ“œ 적용", "ꡬ강 μΌ€μ–΄ 병행", "μ²­κ²° μš©ν’ˆ μ„ ν˜Έλ„ 쑰사"],
 
 
 
 
 
 
 
 
 
 
126
  },
127
  }
128
 
@@ -131,32 +143,35 @@ def make_sentence(area, problems, causes, actions, age, grade, mobility, cogniti
131
  cause_text = ", ".join(causes)
132
  action_text = ", ".join(actions)
133
 
134
- consult = (
135
- f"μˆ˜κΈ‰μžλŠ” 만 {age}μ„Έ, μž₯κΈ°μš”μ–‘ {grade}이며 ν˜„μž¬ μ΄λ™μƒνƒœλŠ” '{mobility}', μΈμ§€μƒνƒœλŠ” '{cognition}'으둜 ν™•μΈλœλ‹€.\n\n"
136
- f"λ°©λ¬Έλͺ©μš• κΈ‰μ—¬μ œκ³΅ κ³Όμ • 및 {area} κ΄€λ ¨ 상담을 μ‹€μ‹œν•œ κ²°κ³Ό, μ£Όμš” λ¬Έμ œμƒν™©μœΌλ‘œ {problem_text}이/κ°€ ν™•μΈλ˜μ—ˆλ‹€. "
137
- f"λͺ©μš• μ„œλΉ„μŠ€ μ§„ν–‰ μ‹œ μˆ˜κΈ‰μžμ˜ ν˜„μž¬ 신체적 가동 λ²”μœ„, 인지 λŠ₯λ ₯, 심리 μƒνƒœμ— λ”°λ₯Έ μ„ΈλΆ€ 관찰이 μš”λ§λœλ‹€.\n\n"
138
- f"상담 κ³Όμ •μ—μ„œ {cause_text} 등이 μ›μΈμœΌλ‘œ μž‘μš©ν•  κ°€λŠ₯성을 ν™•μΈν•˜μ˜€λ‹€. "
139
- f"κΈ°κ΄€μ—μ„œλŠ” λͺ©μš• 쀑 κΈ‰κ²©ν•œ 체λ ₯ μ €ν•˜λ‚˜ ν˜ˆμ•• λ³€ν™”κ°€ λ°œμƒν•˜λŠ”μ§€ 예의 μ£Όμ‹œν•˜κΈ°λ‘œ ν•˜μ˜€λ‹€."
140
- )
141
 
142
- action = (
143
- f"λ°©λ¬Έλͺ©μš• μ§„ν–‰ μ‹œ μˆ˜κΈ‰μžμ˜ μš”κ΅¬μ™€ μƒνƒœμ— λ§žμΆ”μ–΄ {action_text} λ“±μ˜ 쑰치λ₯Ό μ‹€μ‹œν•˜κ±°λ‚˜ κ³„νšν•˜κΈ°λ‘œ ν•˜μ˜€λ‹€. "
144
- f"λͺ©μš• μš”μ–‘λ³΄ν˜Έμ‚¬ 및 동행 μ§μ›μ—κ²Œ μ„ΈλΆ€ 쑰치 사항을 μ „νŒŒν•˜κ³  μ•ˆμ „ν•œ κΈ‰μ—¬ 제곡이 이루어지도둝 μ‘°μΉ˜ν•˜μ˜€λ‹€.\n\n"
145
- f"ν–₯ν›„ λͺ©μš• κ±°λΆ€λ‚˜ 낙상 μœ„ν—˜ λ“± νŠΉμ΄μ‚¬ν•­ 지속 μ‹œ μš•κ΅¬μ‚¬μ •μ— λ°˜μ˜ν•˜κ³ , ν•„μš” μ‹œ λ°©λ¬Έμš”μ–‘/κ°„ν˜Έ μ„œλΉ„μŠ€ 연계λ₯Ό κ²€ν† ν•˜κΈ°λ‘œ ν•˜μ˜€λ‹€."
146
- )
 
147
 
148
- reflection = (
149
- "상담을 톡해 ν™•μΈλœ μš”κ΅¬μ‚¬ν•­ 및 쑰치 κ³„νšμ€ μž₯κΈ°μš”μ–‘ κΈ‰μ—¬μ œκ³΅ 과정에 적극 λ°˜μ˜ν•œλ‹€. "
150
- "반영 κ°€λŠ₯ν•œ μ„ΈλΆ€ 사항은 λ‹€μŒ λ°©λ¬Έλͺ©μš• 일정 μ‹œ μ μš©ν•˜κ³ , "
151
- "μž₯κΈ°μš”μ–‘κΈ°κ΄€ 평가 κ³ μ‹œ 기쀀에 λ§žμΆ”μ–΄ κΈ‰μ—¬μ œκ³΅κ³„νšμ„œ 보완을 κ²€ν† ν•˜κΈ°λ‘œ ν•œλ‹€."
152
- )
 
153
 
154
- monitoring = (
155
- "λͺ©μš• λ‹΄λ‹Ή μš”μ–‘λ³΄ν˜Έμ‚¬μ˜ μ„œλΉ„μŠ€ ν›„ ν”Όλ“œλ°± 및 ν”ΌλΆ€/λ°”μ΄νƒˆ λͺ¨λ‹ˆν„°λ§ 기둝을 μ£Ό 1회 이상 κ²€ν† ν•œλ‹€. "
156
- "λ‹€μŒ 상담 μ‹œ λ¬Έμ œμƒν™©μ˜ 경감 여뢀와 쑰치의 νš¨κ³Όμ„±μ„ λͺ¨λ‹ˆν„°λ§ν•˜μ—¬ 지속적인 μœ„μƒ 관리λ₯Ό μ‹€μ‹œν•˜κΈ°λ‘œ ν•œλ‹€."
157
- )
 
 
158
 
159
- return consult, action, reflection, monitoring
160
 
161
  def make_excel(data, consult, action, reflection, monitoring, checked_items, missing_items):
162
  wb = Workbook()
@@ -181,7 +196,7 @@ def make_excel(data, consult, action, reflection, monitoring, checked_items, mis
181
 
182
  info_rows = [
183
  ("μˆ˜κΈ‰μž μ„±λͺ…", data["μˆ˜κΈ‰μž μ„±λͺ…"], "생년월일", data["생년월일"], "성별", data["성별"]),
184
- ("λ‚˜μ΄", data["λ‚˜μ΄"], "μž₯κΈ°μš”μ–‘ λ“±κΈ‰", data["μž₯κΈ°μš”μ–‘ λ“±κΈ‰"], "μ‹œμž‘μΌ", str(data["μ‹œμž‘μΌ"])),
185
  ("본인뢀담λ₯ ", data["본인뢀담λ₯ "], "μƒλ‹΄μΌμž", str(data["μƒλ‹΄μΌμž"]), "μƒλ‹΄μ‹œκ°„", str(data["μƒλ‹΄μ‹œκ°„"])),
186
  ("상담ꡬ뢄", data["상담ꡬ뢄"], "상담μž₯μ†Œ", data["상담μž₯μ†Œ"], "상담방법", data["상담방법"]),
187
  ("μƒλ‹΄λŒ€μƒμž", data["μƒλ‹΄λŒ€μƒμž"], "관계", data["관계"], "λ™μ„μž", data["λ™μ„μž"]),
@@ -207,9 +222,9 @@ def make_excel(data, consult, action, reflection, monitoring, checked_items, mis
207
  current_row += 1
208
 
209
  sections = [
210
- ("상담 λ‚΄μš© (μˆ˜κΈ‰μž μƒνƒœ λ³€ν™” 및 μš”κ΅¬μ‚¬ν•­)", consult, 3),
211
- ("쑰치 및 ν•΄κ²° κ³„νš", action, 3),
212
- ("κΈ‰μ—¬μ œκ³΅κ³„νš 반영 λ‚΄μš©", reflection, 3),
213
  ("사후 쑰치 및 λͺ¨λ‹ˆν„°λ§ κ³„νš", monitoring, 3),
214
  ]
215
 
@@ -218,14 +233,13 @@ def make_excel(data, consult, action, reflection, monitoring, checked_items, mis
218
  ws.cell(current_row, 1).value = title
219
  ws.cell(current_row, 1).fill = header_fill
220
  ws.cell(current_row, 1).font = Font(bold=True)
221
- ws.cell(current_row, 1).alignment = Alignment(horizontal="center")
222
  current_row += 1
223
 
224
  ws.merge_cells(start_row=current_row, start_column=1, end_row=current_row + height - 1, end_column=9)
225
  ws.cell(current_row, 1).value = text
226
  ws.cell(current_row, 1).alignment = Alignment(horizontal="left", vertical="top", wrap_text=True)
227
 
228
- # ν…μŠ€νŠΈ 길이에 따라 높이λ₯Ό λ™μ μœΌλ‘œ μžλ™ κ³„μ‚°ν•˜μ—¬ 3개 행에 λ‚˜λˆ„μ–΄ λ°°μ •
229
  lines = len(text) // 65 + 1 + text.count('\n') if text else 1
230
  total_height = max(72, lines * 20 + 10)
231
  single_row_height = total_height / height
@@ -238,7 +252,7 @@ def make_excel(data, consult, action, reflection, monitoring, checked_items, mis
238
  ws.merge_cells(start_row=current_row, start_column=4, end_row=current_row, end_column=6)
239
  ws.merge_cells(start_row=current_row, start_column=7, end_row=current_row, end_column=9)
240
 
241
- ws.cell(current_row, 1).value = "μƒλ‹΄μž μ„œλͺ…"
242
  ws.cell(current_row, 4).value = f"{data['λ‹΄λ‹Ήμž']} (μ„œλͺ…)"
243
  ws.cell(current_row, 7).value = "λŒ€μƒμž/보호자 (μ„œλͺ…)"
244
  ws.cell(current_row, 1).fill = header_fill
@@ -287,23 +301,23 @@ with col1:
287
  age = st.number_input("λ‚˜μ΄", min_value=60, max_value=110, value=81)
288
 
289
  with col2:
290
- grade = st.selectbox("μž₯κΈ°μš”μ–‘ λ“±κΈ‰", ["1λ“±κΈ‰", "2λ“±κΈ‰", "3λ“±κΈ‰", "4λ“±κΈ‰", "5λ“±κΈ‰"])
291
  admission_date = st.date_input("계약일/μ‹œμž‘μΌ", date.today())
292
  copay = st.selectbox("본인뢀담λ₯ ", ["15%", "0%", "6%", "9%", "12%", "20%"])
293
  consult_date = st.date_input("μƒλ‹΄μΌμž", date.today())
294
 
295
  with col3:
296
  consult_time = st.time_input("μƒλ‹΄μ‹œκ°„", time(14, 0))
297
- consult_type = st.selectbox("상담 ꡬ뢄", ["μ •κΈ° 상담", "μˆ˜μ‹œ 상담", "μ‹ κ·œ 계약 상담", "보호자 μš”μ²­ 상담"])
298
  place = st.selectbox("상담 μž₯μ†Œ", ["μˆ˜κΈ‰μž μžνƒ", "μ„Όν„° 사무싀", "μœ μ„ μƒλ‹΄", "기타"])
299
- method = st.selectbox("상담 방법", ["λŒ€λ©΄ λ©΄λ‹΄", "μœ μ„ /μ „ν™” 상담", "기타"])
300
  target = st.text_input("상담 λŒ€μƒμž μ„±λͺ…", "μžλ…€")
301
 
302
  col4, col5, col6 = st.columns(3)
303
 
304
  with col4:
305
- relation = st.selectbox("μƒλ‹΄μžμ™€μ˜ 관계", ["λ”Έ", "μ•„λ“€", "본인", "배우자", "며느리", "μ‚¬μœ„", "기타"])
306
- staff_position = st.selectbox("κΈ°κ΄€ λ‹΄λ‹Ήμž 직책", ["μ‚¬νšŒλ³΅μ§€μ‚¬", "μš”μ–‘λ³΄ν˜Έμ‚¬", "κ°„ν˜Έμ‚¬", "μ‹œμ„€μž₯"])
307
  staff_name = st.text_input("κΈ°κ΄€ λ‹΄λ‹Ήμž μ„±λͺ…", "μ‚¬νšŒλ³΅μ§€μ‚¬")
308
 
309
  with col5:
@@ -315,7 +329,7 @@ with col6:
315
  bath_type = st.selectbox("λͺ©μš•μœ ν˜•", ["λ°©λ¬Έλͺ©μš•(μ°¨λŸ‰λ‚΄)", "λ°©λ¬Έλͺ©μš•(κ°€μ •λ‚΄μš•μ‘°)", "κ°€μ •λ‚΄μƒ€μ›Œλ„μ›€", "기타"])
316
  area = st.selectbox("μƒλ‹΄μ˜μ—­ 선택", list(AREA_DATA.keys()))
317
 
318
- st.subheader("λ¬Έμ œμƒν™© / 원인 / 쑰치 선택")
319
 
320
  problems = st.multiselect("λ¬Έμ œμƒν™© 선택", AREA_DATA[area]["problems"], default=AREA_DATA[area]["problems"][:2], key=f"problems_{area}")
321
  causes = st.multiselect("μƒλ‹΄ν•˜κ²Œ 된 원인 선택", AREA_DATA[area]["causes"], default=AREA_DATA[area]["causes"][:2], key=f"causes_{area}")
@@ -334,7 +348,7 @@ elif today_count >= 2:
334
  st.error("🚨 였늘 μ‚¬μš© κ°€λŠ₯ 횟수(2회)λ₯Ό λͺ¨λ‘ μ‚¬μš©ν–ˆμŠ΅λ‹ˆλ‹€. μƒˆλ‘œμš΄ λ¬Έμ„œ 생성은 λΆˆκ°€ν•˜λ©°, μ•„λž˜ κΈ°μ‘΄ μƒμ„±λœ λ¬Έμ„œμ˜ μˆ˜μ • 및 λ‹€μš΄λ‘œλ“œλ§Œ κ°€λŠ₯ν•©λ‹ˆλ‹€.")
335
 
336
  checked_items = []
337
- st.subheader("ν•„μˆ˜ κΈ°μž¬ν•­λͺ© 체크리슀트")
338
  for item in REQUIRED_ITEMS:
339
  if st.checkbox(item, value=True, key=f"check_{item}"):
340
  checked_items.append(item)
@@ -343,7 +357,7 @@ missing_items = [item for item in REQUIRED_ITEMS if item not in checked_items]
343
  score = int((len(checked_items) / len(REQUIRED_ITEMS)) * 100)
344
 
345
  if score == 100:
346
- st.success(f"상담일지 완성도: {score}점 / λˆ„λ½ ν•­λͺ© μ—†μŒ")
347
  elif score >= 85:
348
  st.warning(f"상담일지 완성도: {score}점 / 일뢀 ν•­λͺ© 확인 ν•„μš”")
349
  else:
@@ -383,10 +397,8 @@ if st.button("πŸ“ 상담일지 & μ—‘μ…€ μƒμ„±ν•˜κΈ°", disabled=not can_generat
383
  st.error("였늘 μ‚¬μš© κ°€λŠ₯ 횟수λ₯Ό λͺ¨λ‘ μ‚¬μš©ν–ˆμŠ΅λ‹ˆλ‹€.")
384
  st.stop()
385
 
386
- # 생성 성곡 μ‹œ DB에 횟수 μΆ”κ°€
387
  increase_today_usage(facility, user_id)
388
 
389
- # ν…μŠ€νŠΈ μžλ™ 생성
390
  gen_consult, gen_action, gen_reflection, gen_monitoring = make_sentence(
391
  area, problems, causes, actions, age, grade, mobility, cognition
392
  )
@@ -400,26 +412,24 @@ if st.button("πŸ“ 상담일지 & μ—‘μ…€ μƒμ„±ν•˜κΈ°", disabled=not can_generat
400
  "checked_items": checked_items,
401
  "missing_items": missing_items
402
  }
403
- st.success("πŸŽ‰ 상담일지가 μ„±κ³΅μ μœΌλ‘œ μƒμ„±λ˜μ—ˆμŠ΅λ‹ˆλ‹€! μ•„λž˜μ—μ„œ λ‚΄μš©μ„ 확인 및 μˆ˜μ •ν•œ ν›„ μ—‘μ…€ νŒŒμΌμ„ λ‹€μš΄λ‘œλ“œν•˜μ„Έμš”.")
404
  st.rerun()
405
 
406
- # μƒμ„±λœ 데이터가 μžˆμ„ κ²½μš°μ—λ§Œ ν•„λ“œ 및 λ‹€μš΄λ‘œλ“œ 제곡
407
  if st.session_state.generated_data is not None:
408
  g_data = st.session_state.generated_data
409
 
410
- st.subheader("상담 λ‚΄μš©")
411
  ui_consult = st.text_area("μƒλ‹΄λ‚΄μš© μˆ˜μ • κ°€λŠ₯", g_data["consult"], height=220)
412
 
413
- st.subheader("쑰치 λ‚΄μš©")
414
  ui_action = st.text_area("μ‘°μΉ˜λ‚΄μš© μˆ˜μ • κ°€λŠ₯", g_data["action"], height=180)
415
 
416
- st.subheader("κΈ‰μ—¬μ œκ³΅ 반영 μ—¬λΆ€")
417
  ui_reflection = st.text_area("κΈ‰μ—¬μ œκ³΅ 반영 λ‚΄μš© μˆ˜μ • κ°€λŠ₯", g_data["reflection"], height=130)
418
 
419
  st.subheader("사후 쑰치 및 λͺ¨λ‹ˆν„°λ§ κ³„νš")
420
  ui_monitoring = st.text_area("λͺ¨λ‹ˆν„°λ§ κ³„νš μˆ˜μ • κ°€λŠ₯", g_data["monitoring"], height=130)
421
 
422
- # μˆ˜μ •λœ λ‚΄μš©μœΌλ‘œ μ—‘μ…€ λΉŒλ“œ
423
  excel_file = make_excel(
424
  g_data["data"],
425
  ui_consult,
@@ -433,6 +443,6 @@ if st.session_state.generated_data is not None:
433
  st.download_button(
434
  label="πŸ“₯ μˆ˜κΈ‰μž 상담일지 μ—‘μ…€ λ‹€μš΄λ‘œλ“œ",
435
  data=excel_file,
436
- file_name=f"{g_data['data']['μˆ˜κΈ‰μž μ„±λͺ…']}_{g_data['data']['μƒλ‹΄μ˜μ—­']}_μˆ˜κΈ‰μžμƒλ‹΄μΌμ§€.xlsx",
437
  mime="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"
438
- )
 
5
  from io import BytesIO
6
  from datetime import date, time
7
  import sqlite3
8
+ import random
9
 
10
  st.set_page_config(page_title="λ°©λ¬Έλͺ©μš• μˆ˜κΈ‰μž 상담일지 μžλ™μƒμ„±κΈ°", layout="wide")
11
 
12
+ st.title("πŸ› λ°©λ¬Έλͺ©μš• μˆ˜κΈ‰μž 상담일지 μžλ™μƒμ„±κΈ° v2")
13
+ st.caption("μƒλ‹΄μ˜μ—­ β†’ λ¬Έμ œμƒν™© β†’ 원인 β†’ 쑰치 β†’ κΈ‰μ—¬λ°˜μ˜ β†’ 랜덀 ν…œν”Œλ¦Ώ 기반 μ—‘μ…€ λ‹€μš΄λ‘œλ“œ")
14
  st.warning("⚠️ **β€» λ³Έ μƒμ„±κΈ°λŠ” ν•˜λ£¨ 2회 이용 ν•œλ„ μ œν•œμ΄ μžˆμŠ΅λ‹ˆλ‹€.**")
15
 
16
  DB_FILE = "usage.db"
 
99
  "μƒλ‹΄μž μ„œλͺ…", "λŒ€μƒμž λ˜λŠ” 보호자 μ„œλͺ…"
100
  ]
101
 
102
+ # 곡단 ν‰κ°€μ§€ν‘œλ₯Ό λ°˜μ˜ν•˜μ—¬ μ•ˆμ „/μž₯λΉ„ 및 λ§Œμ‘±λ„ μ˜μ—­ μΆ”κ°€
103
  AREA_DATA = {
104
  "λͺ©μš• κ±°λΆ€/ν˜‘μ‘°λ„": {
105
  "problems": ["λͺ©μš• κ±°λΆ€", "νƒˆμ˜ κ±°λΆ€", "물에 λŒ€ν•œ 곡포심", "ν”ΌλΆ€ 접촉 예민", "ν”Όλ‘œκ° ν˜Έμ†Œ", "μƒ€μ›ŒκΈ° μ†Œλ¦¬μ— λΆˆμ•ˆ"],
106
+ "causes": ["치맀둜 μΈν•œ 인지 μ €ν•˜", "μΆ”μœ„μ— 민감함", "κ³Όκ±° 뢀정적 κ²½ν—˜", "신체 λ…ΈμΆœ μˆ˜μΉ˜μ‹¬", "ν”ΌλΆ€ 건쑰 및 가렀움", "당일 μ»¨λ””μ…˜ μ €ν•˜"],
107
+ "actions": ["λ”°λœ»ν•œ μ‹€λ‚΄ μ˜¨λ„(24~26도) μœ μ§€", "μΆ©λΆ„ν•œ 지지적 λŒ€ν™” 및 라포 ν˜•μ„±", "νƒ€μ›”λ‘œ λͺΈμ„ 감싼 채 μ•ˆμ •κ° 제곡", "μ„ ν˜Έν•˜λŠ” μŒμ•…/ν™˜κ²½ μ‘°μ„±", "κ°„ν˜Έμ‚¬ 및 보호자 νŠΉμ΄μ‚¬ν•­ 곡유"],
108
  },
109
  "ν”ΌλΆ€ μƒνƒœ/발적/μƒμ²˜": {
110
+ "problems": ["ν”ΌλΆ€ 건쑰 심화", "λ‘”λΆ€/미골 발적", "가렀움증(μ†Œμ–‘μ¦) ν˜Έμ†Œ", "ν”ΌλΆ€ 짓무름/λ°±μ„ ", "λ―Έμ„Έ 찰과상 발견", "각질 심화"],
111
+ "causes": ["ν˜ˆμ•‘ μˆœν™˜ μ €ν•˜", "μž₯μ‹œκ°„ 와상/μ’Œμ‹ μƒν™œ", "κΈ°μ €κ·€ μž₯κΈ° 착용으둜 μΈν•œ 슡기", "μˆ˜λΆ„ μ„­μ·¨ λΆ€μ‘±", "λ…Έν™”λ‘œ μΈν•œ ν”ΌλΆ€ μž₯λ²½ μ•½ν™”"],
112
+ "actions": ["λͺ©μš• 직후 보슡제 μΆ©λΆ„νžˆ 도포", "마찰 λ°©μ§€ 및 κ°€λ²Όμš΄ λ§ˆμ‚¬μ§€ 제곡", "ν”ΌλΆ€ μƒνƒœ μœ μ‹¬νžˆ κ΄€μ°° 및 κΈ‰μ—¬μ œκ³΅κΈ°λ‘μ§€ 기재", "κ°„ν˜Έμ‚¬/보호자 즉각 보고", "κΈ°μ €κ·€ ꡐ체 μ£ΌκΈ° 단좕 μ•ˆλ‚΄"],
113
  },
114
  "체온/λ°”μ΄νƒˆ λ³€ν™”": {
115
+ "problems": ["λͺ©μš• μ „ν›„ ν˜ˆμ•• μƒμŠΉ/μ €ν•˜", "λͺ©μš• ν›„ ν•œκΈ°/μ˜€ν•œ ν˜Έμ†Œ", "λ―Έμ—΄ λ°œμƒ", "기립성 μ–΄μ§€λŸ¬μ›€ ν˜Έμ†Œ", "κΈ‰κ²©ν•œ ν”Όλ‘œκ°"],
116
+ "causes": ["μ‹€λ‚΄μ™Έ(μš•μ‹€) μ˜¨λ„μ°¨", "λͺ©μš• 쀑 μˆ˜λΆ„ 손싀", "체λ ₯ μ†Œλͺ¨ κ³Όλ‹€", "κ³Όλ„ν•œ 온수 자극", "κΈ°μ € μ§ˆν™˜(κ³ ν˜ˆμ••/당뇨 λ“±) 영ν–₯"],
117
+ "actions": ["λͺ©μš• μ‹œκ°„ 단좕(20~30λΆ„ μ΄λ‚΄λ‘œ μ‘°μ •)", "λͺ©μš• μ „ν›„ λ”°λœ»ν•œ μˆ˜λΆ„ μ„­μ·¨ 제곡", "μ„œλΉ„μŠ€ μ „ν›„ 체온/ν˜ˆμ•• λ“± λ°”μ΄νƒˆ μƒμ‹œ μΈ‘μ •", "κ°„ν˜Έμ‚¬ 보고 및 μ‘κΈ‰μ‘°μΉ˜ 체계 λŒ€κΈ°", "λ³΄ν˜Έμžμ—κ²Œ νœ΄μ‹ ꢌ고 μ•ˆλ‚΄"],
118
  },
119
  "낙상/이동 λΆˆμ•ˆμ •": {
120
+ "problems": ["λ―Έλ„λŸ¬μš΄ λ°”λ‹₯μ—μ„œ 보행 μœ„ν—˜", "μš•μ‘° μΆœμž… μ‹œ κ· ν˜• 상싀", "λΆ€μΆ• 이동 μ‹œ 체쀑 쏠림", "νœ μ²΄μ–΄ 이동/트랜슀퍼 μ‹œ λΆˆμ•ˆμ •", "기립 μ‹œ 닀리 힘 ν’€λ¦Ό"],
121
+ "causes": ["ν•˜μ§€ κ·Όλ ₯ μ €ν•˜ 및 νŽΈλ§ˆλΉ„", "λ°”λ‹₯ λ¬ΌκΈ° 및 λΉ„λˆ—λ¬Ό μž”λ₯˜", "인지 κΈ°λŠ₯ μ €ν•˜λ‘œ μΈν•œ μ§€μ‹œ λΆˆμ΄ν–‰", "이동 보쑰기ꡬ λ―ΈλΉ„ 및 곡간 ν˜‘μ†Œ"],
122
+ "actions": ["λ―Έλ„λŸΌ λ°©μ§€ 맀트/μŠ€ν‹°μ»€ ν•„μˆ˜ μ‚¬μš©", "μš•μ‹€ λ‚΄ μ•ˆμ „ μ†μž‘μ΄ μœ„μΉ˜ νŒŒμ•… 및 보쑰", "λͺ©μš• 의자 μƒμ‹œ μ‚¬μš© 원칙 μ€€μˆ˜", "이동/이승 μ‹œ 2인 1μ‘° ν˜‘μ‘° 체계 κ°•ν™”", "μˆ˜κΈ‰μž 및 보호자 λŒ€μƒ 낙상 예방 μˆ˜μΉ™ 재ꡐ윑"],
123
  },
124
  "μœ„μƒ/일반 κ±΄κ°•μƒνƒœ": {
125
+ "problems": ["두피 각질/비듬 심화", "μ†λ°œν†± μœ„μƒ 관리 ν•„μš”", "λ°°μ„€λ¬Ό μ˜€μ—Ό 방치", "ꡬ강 μœ„μƒ λΆˆλŸ‰", "체취/μš•μ°½ λƒ„μƒˆ 심화"],
126
+ "causes": ["κ°œμΈμœ„μƒ μžκ°€ 관리 λŠ₯λ ₯ 상싀", "인지 μ €ν•˜λ‘œ μΈν•œ μœ„μƒ μΌ€μ–΄ κ±°λΆ€", "κ΄€μ ˆ ꡬ좕 λ“± 신체 λ™μž‘ λ²”μœ„ μ œν•œ"],
127
+ "actions": ["두피 μ „μš© μƒ΄ν‘Έλ‘œ 집쀑 μ„Έμ •", "λͺ©μš• ν›„ μ†λ°œν†± μ•ˆμ „ν•˜κ²Œ 정리", "λ°°μ„€λ¬Ό μ˜€μ—Ό λΆ€μœ„ λΆ€λΆ„ μ„Έμ • κ°€μ΄λ“œ 적용", "λ³΄ν˜Έμžμ—κ²Œ ꡬ강 μΌ€μ–΄ 병행 ꢌ고", "μ²­κ²° μš©ν’ˆ μ„ ν˜Έλ„ 쑰사 및 반영"],
128
+ },
129
+ "ν™˜κ²½/μ°¨λŸ‰/μž₯λΉ„ μ•ˆμ „": {
130
+ "problems": ["λͺ©μš• μ°¨λŸ‰ λ‚΄ μ˜¨λ„ 쑰절 미흑", "λ¦¬ν”„νŠΈ νƒ‘μŠΉ μ‹œ 극도 λΆˆμ•ˆκ°", "μ°¨λŸ‰ λ‚΄ μˆ˜μ•• 약함/온수 λΆ€μ‘±", "이동식 μš•μ‘° μœ„μƒ μƒνƒœ 우렀"],
131
+ "causes": ["λ™μ ˆκΈ° 기온 κΈ‰κ°•ν•˜", "기계 μž‘λ™ μ†ŒμŒμ— λŒ€ν•œ 곡포", "μ°¨λŸ‰ λ…Έν›„ν™” 및 점검 μ§€μ—°", "보호자의 감염/μœ„μƒ 민감도 증가"],
132
+ "actions": ["μ°¨λŸ‰ λ°©λ¬Έ μ „ νžˆν„°/온수 사전 가동", "λ¦¬ν”„νŠΈ 이용 μ‹œ λ°€μ°©ν•˜μ—¬ μ•ˆμ‹¬ μ‹œν‚€κΈ°", "정기적인 μ°¨λŸ‰/μž₯λΉ„ μœ μ§€λ³΄μˆ˜ 점검", "λ³΄ν˜Έμžμ—κ²Œ λͺ©μš•μ‘° μ†Œλ… 일지 확인 및 μ² μ €ν•œ μ†Œλ… μ•ˆλ‚΄"],
133
+ },
134
+ "μ„œλΉ„μŠ€ λ§Œμ‘±λ„ 및 μš”κ΅¬μ‚¬ν•­": {
135
+ "problems": ["μ„œλΉ„μŠ€ 제곡 μ‹œκ°„ λ³€κ²½ μš”μ²­", "νŠΉμ • μš”μ–‘λ³΄ν˜Έμ‚¬ μ„ ν˜Έ/κΈ°ν”Ό", "μš”μ–‘λ³΄ν˜Έμ‚¬μ™€μ˜ μ˜μ‚¬μ†Œν†΅ λΆ€μž¬", "μ„œλΉ„μŠ€ μ‹œκ°„(μ†Œμš”μ‹œκ°„) λΆ€μ‘± ν˜Έμ†Œ"],
136
+ "causes": ["보호자 개인 일정 λ³€κ²½", "μˆ˜κΈ‰μžμ™€ μ’…μ‚¬μž κ°„ μ„±ν–₯ 차이", "μˆ˜κΈ‰μž 청각 μ €ν•˜/치맀", "μ€‘μ¦λ„λ‘œ μΈν•œ μΌ€μ–΄ μ‹œκ°„ μ§€μ—°"],
137
+ "actions": ["μ„Όν„° 일정 확인 ν›„ 쑰율 κ°€λŠ₯ μ—¬λΆ€ μ¦‰μ‹œ μ•ˆλ‚΄", "μš”μ› ꡐ체 λ©΄λ‹΄ 및 λ‚΄λΆ€ 회의 μ§„ν–‰", "큰 λͺ©μ†Œλ¦¬λ‘œ 천천히 μ„€λͺ…ν•˜λ„λ‘ μ’…μ‚¬μž 재ꡐ윑", "ν•œλ„ λ‚΄μ—μ„œ μ΅œλŒ€ν•œ 효율적이고 κΌΌκΌΌν•œ μ§„ν–‰ 약속"],
138
  },
139
  }
140
 
 
143
  cause_text = ", ".join(causes)
144
  action_text = ", ".join(actions)
145
 
146
+ # 1. μƒλ‹΄λ‚΄μš© (3κ°€μ§€ 랜덀 ν…œν”Œλ¦Ώ)
147
+ consult_templates = [
148
+ f"μˆ˜κΈ‰μžλŠ” 만 {age}μ„Έ, μž₯κΈ°μš”μ–‘ {grade}이며 ν˜„μž¬ μ΄λ™μƒνƒœλŠ” '{mobility}', μΈμ§€μƒνƒœλŠ” '{cognition}'으둜 확인됨.\n\nλ°©λ¬Έλͺ©μš• κΈ‰μ—¬μ œκ³΅ κ³Όμ • 및 {area} κ΄€λ ¨ μ •κΈ°/μˆ˜μ‹œ 상담을 μ‹€μ‹œν•œ κ²°κ³Ό, μ£Όμš” λ¬Έμ œμƒν™©μœΌλ‘œ {problem_text} νŠΉμ΄μ‚¬ν•­μ΄ 확인됨. λͺ©μš• μ„œλΉ„μŠ€ μ§„ν–‰ μ‹œ μˆ˜κΈ‰μžμ˜ ν˜„μž¬ 신체적 가동 λ²”μœ„μ™€ 인지, 심리 μƒνƒœμ— λ”°λ₯Έ μ„Έλ°€ν•œ 관찰이 μš”λ§λ¨.\n\n상담 κ³Όμ •μ—μ„œ μœ„ 문제의 주된 μ›μΈμœΌλ‘œ {cause_text} 등이 μž‘μš©ν•  κ°€λŠ₯성을 보호자 및 μ’…μ‚¬μžμ™€ κ³΅μœ ν•˜μ˜€μœΌλ©°, μ„œλΉ„μŠ€ 쀑 κΈ‰κ²©ν•œ μ»¨λ””μ…˜ μ €ν•˜ 방지에 쀑점을 λ‘κΈ°λ‘œ 함.",
149
+ f"λŒ€μƒμž(만 {age}μ„Έ, μž₯κΈ°μš”μ–‘ {grade}, μ΄λ™μƒνƒœ: {mobility}, μΈμ§€μƒνƒœ: {cognition})의 졜근 λ°©λ¬Έλͺ©μš• μ„œλΉ„μŠ€ 이용 μ‹€νƒœμ™€ {area} μ˜μ—­μ— λŒ€ν•΄ 심측 상담을 진행함.\n\n졜근 κΈ‰μ—¬μ œκ³΅ 쀑 {problem_text} μœ„μ£Όμ˜ 문제점 및 μš•κ΅¬κ°€ μ§€μ†μ μœΌλ‘œ 관찰됨. μ£Όμš” μ›μΈμœΌλ‘œλŠ” {cause_text} 등이 μ§€λͺ©λ˜μ—ˆμœΌλ©°, μˆ˜κΈ‰μžμ˜ μ•ˆμ „ 확보와 μ„œλΉ„μŠ€ 질 ν–₯상을 μœ„ν•œ λŒ€μ±… 및 ν™˜κ²½ κ°œμ„ μ΄ ν•„μš”ν•œ μƒν™©μž„.",
150
+ f"λ³Έ μˆ˜κΈ‰μž(만 {age}μ„Έ, {grade})λŠ” ν‰μ†Œ {mobility} μˆ˜μ€€μ˜ 신체기λŠ₯을 보이며 인지 μƒνƒœλŠ” {cognition}μž„. 금일 {area} κ΄€λ ¨ν•˜μ—¬ μˆ˜κΈ‰μž/λ³΄ν˜Έμžμ™€ 면담을 μ§„ν–‰ν•œ κ²°κ³Ό {problem_text} λ“±μ˜ μ• λ‘œμ‚¬ν•­μ΄ λ°œμƒν•˜κ³  있음.\n\nμ΄λŠ” {cause_text}에 κΈ°μΈν•œ κ²ƒμœΌλ‘œ νŒŒμ•…λ˜λ©°, λ°©λ¬Έλͺ©μš• 쀑 λ°œμƒν•  수 μžˆλŠ” μ•ˆμ „μ‚¬κ³ λ‚˜ 감염, 체λ ₯ μ €ν•˜λ₯Ό μ˜ˆλ°©ν•˜κΈ° μœ„ν•΄ λͺ©μš• μ „ν›„ μ„Έμ‹¬ν•œ μƒνƒœ νŒŒμ•…μ΄ ν•„μˆ˜μ μž„."
151
+ ]
 
152
 
153
+ # 2. μ‘°μΉ˜λ‚΄μš© (3κ°€μ§€ 랜덀 ν…œν”Œλ¦Ώ)
154
+ action_templates = [
155
+ f"λ°©λ¬Έλͺ©μš• μ§„ν–‰ μ‹œ μˆ˜κΈ‰μžμ˜ 당일 μš”κ΅¬μ™€ μ»¨λ””μ…˜μ— λ§žμΆ”μ–΄ {action_text} λ“±μ˜ 쑰치λ₯Ό μ¦‰μ‹œ μ‹€μ‹œ(λ˜λŠ” κ³„νš)ν•˜κΈ°λ‘œ 함. λͺ©μš• μš”μ–‘λ³΄ν˜Έμ‚¬ 2μΈμ—κ²Œ μ„ΈλΆ€ 쑰치 및 μ•ˆμ „ μˆ˜μΉ™μ„ μ „νŒŒν•˜μ—¬ 평가 기쀀에 λΆ€ν•©ν•˜λŠ” μ•ˆμ „ν•œ κΈ‰μ—¬ 제곡이 이루어지도둝 μ‘°μΉ˜ν•¨.",
156
+ f"ν•΄κ²° λ°©μ•ˆμœΌλ‘œ {action_text} 쑰치λ₯Ό ν˜„μž₯에 μ μš©ν•˜κΈ°λ‘œ 함. λ‹΄λ‹Ή μš”μ–‘λ³΄ν˜Έμ‚¬μ—κ²Œ ν•΄λ‹Ή λ‚΄μš©μ„ μ „λ‹¬ν•˜μ—¬ μ„œλΉ„μŠ€ μ ˆμ°¨μ— λ°˜μ˜ν† λ‘ κ΅μœ‘ν•˜μ˜€μœΌλ©°, ν–₯ν›„ 낙상/피뢀이상/κ±°λΆ€ λ“± νŠΉμ΄μ‚¬ν•­ 지속 μ‹œ λ°©λ¬Έκ°„ν˜Έ λ“± 타 μ§μ—­κ³Όμ˜ 연계 및 정보 곡유λ₯Ό κ°•ν™”ν•˜κΈ°λ‘œ 함.",
157
+ f"상담 결과에 따라 {action_text} λ“± μˆ˜κΈ‰μž λ§žμΆ€ν˜• 쑰치λ₯Ό μ œκ³΅ν•˜κΈ°λ‘œ 결정함. μ„Όν„° λ‚΄ 회의λ₯Ό 톡해 λ³€κ²½λœ μ„œλΉ„μŠ€ 제곡 지침을 λͺ©μš• μ°¨λŸ‰ 및 동행 μ§μ›μ—κ²Œ κ³΅μ§€ν•˜μ˜€μœΌλ©°, 즉각적인 ν˜„μž₯ μ μš©μ„ 톡해 보호자의 λΆˆμ•ˆκ°μ„ ν•΄μ†Œμ‹œν‚€κ³ μž 함."
158
+ ]
159
 
160
+ # 3. κΈ‰μ—¬μ œκ³΅ λ°˜μ˜λ‚΄μš© (3κ°€μ§€ 랜덀 ν…œν”Œλ¦Ώ)
161
+ reflection_templates = [
162
+ "상담을 톡해 ν™•μΈλœ μš”κ΅¬μ‚¬ν•­ 및 쑰치 κ³„νšμ€ μž₯κΈ°μš”μ–‘ κΈ‰μ—¬μ œκ³΅ 과정에 적극 λ°˜μ˜ν•¨. 즉각 반영 κ°€λŠ₯ν•œ μ„ΈλΆ€ 사항은 λ‹€μŒ λ°©λ¬Έλͺ©μš• 일정뢀터 λ°”λ‘œ μ μš©ν•˜λ©°, ν•„μš”μ‹œ μž₯κΈ°μš”μ–‘κΈ°κ΄€ 평가 κ³ μ‹œ 기쀀에 λ§žμΆ”μ–΄ 'κΈ‰μ—¬μ œκ³΅κ³„νšμ„œ' λ³€κ²½ 및 보완을 κ²€ν† ν•˜κΈ°λ‘œ 함.",
163
+ "금일 νŒŒμ•…λœ μˆ˜κΈ‰μžμ˜ μš•κ΅¬ 및 문제 상황을 λ‹€μŒ 달 κΈ‰μ—¬μ œκ³΅μΌμ • 및 μ„œλΉ„μŠ€ λ‚΄μš©μ— λ°˜μ˜ν•¨. μ’…μ‚¬μž μΈμˆ˜μΈκ³„ λŒ€μž₯에 κΈ°λ‘ν•˜μ—¬ λͺ©μš• μš”μ›μ΄ λ³€λ™λ˜λ”λΌλ„ 연속적인 μΌ€μ–΄κ°€ μ΄λ£¨μ–΄μ§ˆ 수 μžˆλ„λ‘ μ‘°μΉ˜ν•¨.",
164
+ "μˆ˜κΈ‰μžμ˜ μ•ˆμ „ 및 μœ„μƒ 증진을 μœ„ν•΄ 상담 κ²°κ³Όλ₯Ό ν˜„ν–‰ κΈ‰μ—¬μ œκ³΅κ³„νšμ— λ°˜μ˜ν•¨. μƒνƒœ λ³€ν™”κ°€ λšœλ ·ν•  경우 κΈ‰μ—¬μ œκ³΅κ³„νšμ„œλ₯Ό μž¬μž‘μ„±ν•˜μ—¬ μˆ˜κΈ‰μž 및 λ³΄ν˜Έμžμ—κ²Œ μž¬κ΅λΆ€/λ™μ˜λ₯Ό 얻을 μ˜ˆμ •μž„."
165
+ ]
166
 
167
+ # 4. λͺ¨λ‹ˆν„°λ§ κ³„νš (3κ°€μ§€ 랜덀 ν…œν”Œλ¦Ώ)
168
+ monitoring_templates = [
169
+ "λͺ©μš• λ‹΄λ‹Ή μš”μ–‘λ³΄ν˜Έμ‚¬μ˜ μ„œλΉ„μŠ€ 제곡 기둝지와 νŠΉμ΄μ‚¬ν•­ ν”Όλ“œλ°±μ„ λ§€μ£Ό κ²€ν† ν•  μ˜ˆμ •μž„. λ‹€μŒ 상담 μ‹œ ν•΄λ‹Ή λ¬Έμ œμƒν™©μ΄ μ–Όλ§ˆλ‚˜ κ²½κ°λ˜μ—ˆλŠ”μ§€, 쑰치의 νš¨κ³Όμ„±μ€ μ–΄λ– ν•œμ§€ ν‰κ°€ν•˜μ—¬ 지속적이고 μΎŒμ ν•œ λͺ©μš• 관리λ₯Ό μ‹€μ‹œν•˜κΈ°λ‘œ 함.",
170
+ "μ‘°μΉ˜μ‚¬ν•­ 적용 ν›„ 1~2μ£Όκ°„ λ°©λ¬Έλͺ©μš• λͺ¨λ‹ˆν„°λ§μ„ μ§‘μ€‘μ μœΌλ‘œ μ‹€μ‹œν•¨. μˆ˜κΈ‰μžμ˜ ν‘œμ • λ³€ν™”, λ°”μ΄νƒˆ, ν”ΌλΆ€ μƒνƒœ κ°œμ„  μ—¬λΆ€λ₯Ό μœ μ„  λ˜λŠ” 방문을 톡해 ν™•μΈν•˜κ³  λ³΄ν˜Έμžμ™€ 주기적으둜 μ†Œν†΅ν•  κ³„νšμž„.",
171
+ "μˆ˜κΈ‰μžμ˜ λͺ©μš• ν›„ λ§Œμ‘±λ„ 및 μƒνƒœ λ³€ν™”λ₯Ό μš”μ–‘λ³΄ν˜Έμ‚¬λ₯Ό 톡해 맀회 μ „λ‹¬λ°›κΈ°λ‘œ 함. 좔가적인 문제 λ°œμƒ μ‹œ μ„Όν„°μž₯ 및 μ‚¬νšŒλ³΅μ§€μ‚¬κ°€ 즉각 κ°œμž…ν•˜μ—¬ 원인을 λΆ„μ„ν•˜κ³  λŒ€μ•ˆμ„ μž¬μˆ˜λ¦½ν•˜κΈ°λ‘œ 함."
172
+ ]
173
 
174
+ return random.choice(consult_templates), random.choice(action_templates), random.choice(reflection_templates), random.choice(monitoring_templates)
175
 
176
  def make_excel(data, consult, action, reflection, monitoring, checked_items, missing_items):
177
  wb = Workbook()
 
196
 
197
  info_rows = [
198
  ("μˆ˜κΈ‰μž μ„±λͺ…", data["μˆ˜κΈ‰μž μ„±λͺ…"], "생년월일", data["생년월일"], "성별", data["성별"]),
199
+ ("λ‚˜μ΄", f"만 {data['λ‚˜μ΄']}μ„Έ", "μž₯κΈ°μš”μ–‘λ“±κΈ‰", data["μž₯κΈ°μš”μ–‘ λ“±κΈ‰"], "계약/μ‹œμž‘μΌ", str(data["μ‹œμž‘μΌ"])),
200
  ("본인뢀담λ₯ ", data["본인뢀담λ₯ "], "μƒλ‹΄μΌμž", str(data["μƒλ‹΄μΌμž"]), "μƒλ‹΄μ‹œκ°„", str(data["μƒλ‹΄μ‹œκ°„"])),
201
  ("상담ꡬ뢄", data["상담ꡬ뢄"], "상담μž₯μ†Œ", data["상담μž₯μ†Œ"], "상담방법", data["상담방법"]),
202
  ("μƒλ‹΄λŒ€μƒμž", data["μƒλ‹΄λŒ€μƒμž"], "관계", data["관계"], "λ™μ„μž", data["λ™μ„μž"]),
 
222
  current_row += 1
223
 
224
  sections = [
225
+ ("상담 λ‚΄μš© (μˆ˜κΈ‰μž μƒνƒœ λ³€ν™” 및 λ¬Έμ œμƒν™©/원인 뢄석)", consult, 3),
226
+ ("쑰치 λ‚΄μš© 및 제곡된 정보", action, 3),
227
+ ("μž₯κΈ°μš”μ–‘ κΈ‰μ—¬μ œκ³΅κ³„νš 반영 λ‚΄μš©", reflection, 3),
228
  ("사후 쑰치 및 λͺ¨λ‹ˆν„°λ§ κ³„νš", monitoring, 3),
229
  ]
230
 
 
233
  ws.cell(current_row, 1).value = title
234
  ws.cell(current_row, 1).fill = header_fill
235
  ws.cell(current_row, 1).font = Font(bold=True)
236
+ ws.cell(current_row, 1).alignment = Alignment(horizontal="center", vertical="center")
237
  current_row += 1
238
 
239
  ws.merge_cells(start_row=current_row, start_column=1, end_row=current_row + height - 1, end_column=9)
240
  ws.cell(current_row, 1).value = text
241
  ws.cell(current_row, 1).alignment = Alignment(horizontal="left", vertical="top", wrap_text=True)
242
 
 
243
  lines = len(text) // 65 + 1 + text.count('\n') if text else 1
244
  total_height = max(72, lines * 20 + 10)
245
  single_row_height = total_height / height
 
252
  ws.merge_cells(start_row=current_row, start_column=4, end_row=current_row, end_column=6)
253
  ws.merge_cells(start_row=current_row, start_column=7, end_row=current_row, end_column=9)
254
 
255
+ ws.cell(current_row, 1).value = "κΈ°κ΄€ λ‹΄λ‹Ήμž μ„œλͺ…"
256
  ws.cell(current_row, 4).value = f"{data['λ‹΄λ‹Ήμž']} (μ„œλͺ…)"
257
  ws.cell(current_row, 7).value = "λŒ€μƒμž/보호자 (μ„œλͺ…)"
258
  ws.cell(current_row, 1).fill = header_fill
 
301
  age = st.number_input("λ‚˜μ΄", min_value=60, max_value=110, value=81)
302
 
303
  with col2:
304
+ grade = st.selectbox("μž₯κΈ°μš”μ–‘ λ“±κΈ‰", ["1λ“±κΈ‰", "2λ“±κΈ‰", "3λ“±κΈ‰", "4λ“±κΈ‰", "5λ“±κΈ‰", "인지지원등급"])
305
  admission_date = st.date_input("계약일/μ‹œμž‘μΌ", date.today())
306
  copay = st.selectbox("본인뢀담λ₯ ", ["15%", "0%", "6%", "9%", "12%", "20%"])
307
  consult_date = st.date_input("μƒλ‹΄μΌμž", date.today())
308
 
309
  with col3:
310
  consult_time = st.time_input("μƒλ‹΄μ‹œκ°„", time(14, 0))
311
+ consult_type = st.selectbox("상담 ꡬ뢄", ["μ •κΈ° 상담", "μˆ˜μ‹œ 상담", "μ‹ κ·œ 계약 상담", "보호자 μš”μ²­ 상담", "뢈만 처리 상담"])
312
  place = st.selectbox("상담 μž₯μ†Œ", ["μˆ˜κΈ‰μž μžνƒ", "μ„Όν„° 사무싀", "μœ μ„ μƒλ‹΄", "기타"])
313
+ method = st.selectbox("상담 방법", ["λŒ€λ©΄ λ©΄λ‹΄", "μœ μ„ /μ „ν™” 상담", "보호자 μ•± μ•Œλ¦Όμž₯", "기타"])
314
  target = st.text_input("상담 λŒ€μƒμž μ„±λͺ…", "μžλ…€")
315
 
316
  col4, col5, col6 = st.columns(3)
317
 
318
  with col4:
319
+ relation = st.selectbox("μƒλ‹΄μžμ™€μ˜ 관계", ["λ”Έ", "μ•„λ“€", "본인", "배우자", "며느리", "μ‚¬μœ„", "기타 보호자"])
320
+ staff_position = st.selectbox("κΈ°κ΄€ λ‹΄λ‹Ήμž 직책", ["μ‚¬νšŒλ³΅μ§€μ‚¬", "λ°©λ¬Έκ°„ν˜Έμ‚¬", "μš”μ–‘λ³΄ν˜Έμ‚¬", "μ‹œμ„€μž₯"])
321
  staff_name = st.text_input("κΈ°κ΄€ λ‹΄λ‹Ήμž μ„±λͺ…", "μ‚¬νšŒλ³΅μ§€μ‚¬")
322
 
323
  with col5:
 
329
  bath_type = st.selectbox("λͺ©μš•μœ ν˜•", ["λ°©λ¬Έλͺ©μš•(μ°¨λŸ‰λ‚΄)", "λ°©λ¬Έλͺ©μš•(κ°€μ •λ‚΄μš•μ‘°)", "κ°€μ •λ‚΄μƒ€μ›Œλ„μ›€", "기타"])
330
  area = st.selectbox("μƒλ‹΄μ˜μ—­ 선택", list(AREA_DATA.keys()))
331
 
332
+ st.subheader("λ¬Έμ œμƒν™© / 원인 / 쑰치 선택 (ν‰κ°€μ§€ν‘œ 연계)")
333
 
334
  problems = st.multiselect("λ¬Έμ œμƒν™© 선택", AREA_DATA[area]["problems"], default=AREA_DATA[area]["problems"][:2], key=f"problems_{area}")
335
  causes = st.multiselect("μƒλ‹΄ν•˜κ²Œ 된 원인 선택", AREA_DATA[area]["causes"], default=AREA_DATA[area]["causes"][:2], key=f"causes_{area}")
 
348
  st.error("🚨 였늘 μ‚¬μš© κ°€λŠ₯ 횟수(2회)λ₯Ό λͺ¨λ‘ μ‚¬μš©ν–ˆμŠ΅λ‹ˆλ‹€. μƒˆλ‘œμš΄ λ¬Έμ„œ 생성은 λΆˆκ°€ν•˜λ©°, μ•„λž˜ κΈ°μ‘΄ μƒμ„±λœ λ¬Έμ„œμ˜ μˆ˜μ • 및 λ‹€μš΄λ‘œλ“œλ§Œ κ°€λŠ₯ν•©λ‹ˆλ‹€.")
349
 
350
  checked_items = []
351
+ st.subheader("ν•„μˆ˜ κΈ°μž¬ν•­λͺ© 체크리슀트 (곡단 ν‰κ°€μ§€ν‘œ κΈ°μ€€)")
352
  for item in REQUIRED_ITEMS:
353
  if st.checkbox(item, value=True, key=f"check_{item}"):
354
  checked_items.append(item)
 
357
  score = int((len(checked_items) / len(REQUIRED_ITEMS)) * 100)
358
 
359
  if score == 100:
360
+ st.success(f"상담일지 완성도: {score}점 / λˆ„λ½ ν•­λͺ© μ—†μŒ (ν‰κ°€μ§€ν‘œ μΆ©μ‘±)")
361
  elif score >= 85:
362
  st.warning(f"상담일지 완성도: {score}점 / 일뢀 ν•­λͺ© 확인 ν•„μš”")
363
  else:
 
397
  st.error("였늘 μ‚¬μš© κ°€λŠ₯ 횟수λ₯Ό λͺ¨λ‘ μ‚¬μš©ν–ˆμŠ΅λ‹ˆλ‹€.")
398
  st.stop()
399
 
 
400
  increase_today_usage(facility, user_id)
401
 
 
402
  gen_consult, gen_action, gen_reflection, gen_monitoring = make_sentence(
403
  area, problems, causes, actions, age, grade, mobility, cognition
404
  )
 
412
  "checked_items": checked_items,
413
  "missing_items": missing_items
414
  }
415
+ st.success("πŸŽ‰ ν‰κ°€μ§€ν‘œμ— 맞좘 상담일지가 λ¬΄μž‘μœ„ ν…œν”Œλ¦ΏμœΌλ‘œ μƒμ„±λ˜μ—ˆμŠ΅λ‹ˆλ‹€! μ•„λž˜μ—μ„œ λ‚΄μš©μ„ 확인 및 μˆ˜μ •ν•œ ν›„ μ—‘μ…€ νŒŒμΌμ„ λ‹€μš΄λ‘œλ“œν•˜μ„Έμš”.")
416
  st.rerun()
417
 
 
418
  if st.session_state.generated_data is not None:
419
  g_data = st.session_state.generated_data
420
 
421
+ st.subheader("상담 λ‚΄μš© (μˆ˜κΈ‰μž μƒνƒœ λ³€ν™” 및 λ¬Έμ œμƒν™©/원인 뢄석)")
422
  ui_consult = st.text_area("μƒλ‹΄λ‚΄μš© μˆ˜μ • κ°€λŠ₯", g_data["consult"], height=220)
423
 
424
+ st.subheader("쑰치 λ‚΄μš© 및 제곡된 정보")
425
  ui_action = st.text_area("μ‘°μΉ˜λ‚΄μš© μˆ˜μ • κ°€λŠ₯", g_data["action"], height=180)
426
 
427
+ st.subheader("μž₯κΈ°μš”μ–‘ κΈ‰μ—¬μ œκ³΅κ³„νš 반영 λ‚΄μš©")
428
  ui_reflection = st.text_area("κΈ‰μ—¬μ œκ³΅ 반영 λ‚΄μš© μˆ˜μ • κ°€λŠ₯", g_data["reflection"], height=130)
429
 
430
  st.subheader("사후 쑰치 및 λͺ¨λ‹ˆν„°λ§ κ³„νš")
431
  ui_monitoring = st.text_area("λͺ¨λ‹ˆν„°λ§ κ³„νš μˆ˜μ • κ°€λŠ₯", g_data["monitoring"], height=130)
432
 
 
433
  excel_file = make_excel(
434
  g_data["data"],
435
  ui_consult,
 
443
  st.download_button(
444
  label="πŸ“₯ μˆ˜κΈ‰μž 상담일지 μ—‘μ…€ λ‹€μš΄λ‘œλ“œ",
445
  data=excel_file,
446
+ file_name=f"{g_data['data']['μˆ˜κΈ‰μž μ„±λͺ…']}_{g_data['data']['μƒλ‹΄μ˜μ—­']}_λ°©λ¬Έλͺ©μš•상담일지.xlsx",
447
  mime="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"
448
+ )