Просмотр исходного кода

Merge branch 'master' of http://47.107.245.0:3000/xiongxing/kyj-yanglao-web-new

xiongxing 2 дней назад
Родитель
Сommit
5bb0619450

+ 1116 - 0
src/views/elderly/apply/nine-precautions/anti-entertainment/AddForm.vue

@@ -0,0 +1,1116 @@
+<template>
+  <el-drawer v-model="dialogVisible" :title="title" size="90%" :before-close="handleClosed">
+    <div class="assessment-form">
+      <div class="form-header">
+        <el-form :model="dataForm" :rules="rules" ref="formRef" label-width="80px">
+          <el-row :gutter="20">
+            <el-col :span="6">
+              <el-form-item label="姓名" prop="elderName">
+                <SelectElder
+                   v-model="dataForm.elderId"
+                    ref="selectElderRef" :tId="dataForm.tenantId" @elder="elderUp" :disabled="isDetail"
+                   />
+              </el-form-item>
+            </el-col>
+            <el-col :span="6">
+              <el-form-item label="年龄">
+                <el-input v-model="dataForm.elderAge" disabled />
+              </el-form-item>
+            </el-col>
+            <el-col :span="6">
+              <el-form-item label="性别">
+                <el-input v-model="dataForm.elderSex" disabled />
+              </el-form-item>
+            </el-col>
+            <el-col :span="6">
+              <el-form-item label="房号/床号">
+                <el-input v-model="dataForm.bedName" disabled />
+              </el-form-item>
+            </el-col>
+          </el-row>
+        </el-form>
+      </div>
+
+      <!-- 评估表 -->
+      <div class="risk-factors-section">
+        <div class="section-title">文娱活动风险评估表</div>
+
+        <div class="table-wrapper">
+          <table class="assessment-table">
+            <thead>
+              <tr>
+                <th class="col-factor">评估项目</th>
+                <th class="col-standard">评估内容及评分标准</th>
+                <th class="col-score">得分</th>
+              </tr>
+            </thead>
+            <tbody>
+              <!-- 身体健康状况基础疾病 -->
+              <tr>
+                <td class="col-factor" rowspan="4">身体健康状况基础疾病</td>
+                <td class="col-standard">
+                  <el-radio-group v-model="form.assessment.scores[0]" :disabled="isDetail" @change="calculateTotal">
+                    <el-radio :label="2">两项疾病以上(>2项)=2分+不适合=5分</el-radio>
+                    <el-radio :label="1">两项疾病以下(≤2项)=1分+适合=0分</el-radio>
+                    <el-radio :label="2">两项疾病以上(>2项)2分+身体适合0分=2分</el-radio>
+                    <el-radio :label="6">两项疾病以下(≤2项)1分+身体不适合5分=6分</el-radio>
+                  </el-radio-group>
+                </td>
+                <td class="col-score" rowspan="4">{{ form.assessment.scores[0] ?? '-' }}</td>
+              </tr>
+              <tr><td class="col-standard empty-row"></td></tr>
+              <tr><td class="col-standard empty-row"></td></tr>
+              <tr><td class="col-standard empty-row"></td></tr>
+
+              <!-- 跌倒风险与行动能力 -->
+              <tr>
+                <td class="col-factor" rowspan="3">跌倒风险与行动能力</td>
+                <td class="col-standard">
+                  <el-radio-group v-model="form.assessment.scores[1]" :disabled="isDetail" @change="calculateTotal">
+                    <el-radio :label="8">高风险=5分+完全依赖=3分</el-radio>
+                    <el-radio :label="3">中风险=1分+需要协助=2分</el-radio>
+                    <el-radio :label="0">低风险=0分+正常=0分</el-radio>
+                  </el-radio-group>
+                </td>
+                <td class="col-score" rowspan="3">{{ form.assessment.scores[1] ?? '-' }}</td>
+              </tr>
+              <tr><td class="col-standard empty-row"></td></tr>
+              <tr><td class="col-standard empty-row"></td></tr>
+
+              <!-- 走失风险与认知能力 -->
+              <tr>
+                <td class="col-factor" rowspan="3">走失风险与认知能力</td>
+                <td class="col-standard">
+                  <el-radio-group v-model="form.assessment.scores[2]" :disabled="isDetail" @change="calculateTotal">
+                    <el-radio :label="8">高风险=5分+确诊认知功能障碍=3分</el-radio>
+                    <el-radio :label="3">中风险=1分+疑似认知功能障碍=2分</el-radio>
+                    <el-radio :label="0">低风险=0分+无认知功能障碍=0分</el-radio>
+                  </el-radio-group>
+                </td>
+                <td class="col-score" rowspan="3">{{ form.assessment.scores[2] ?? '-' }}</td>
+              </tr>
+              <tr><td class="col-standard empty-row"></td></tr>
+              <tr><td class="col-standard empty-row"></td></tr>
+
+              <!-- 心理健康状况 -->
+              <tr>
+                <td class="col-factor" rowspan="3">心理健康状况</td>
+                <td class="col-standard">
+                  <el-radio-group v-model="form.assessment.scores[3]" :disabled="isDetail" @change="calculateTotal">
+                    <el-radio :label="6">状况很差=3分+抑郁=3分</el-radio>
+                    <el-radio :label="3">状况较差=1分+冷漠=2分</el-radio>
+                    <el-radio :label="0">状况良好(正常)=0</el-radio>
+                  </el-radio-group>
+                </td>
+                <td class="col-score" rowspan="3">{{ form.assessment.scores[3] ?? '-' }}</td>
+              </tr>
+              <tr><td class="col-standard empty-row"></td></tr>
+              <tr><td class="col-standard empty-row"></td></tr>
+
+              <!-- 他伤及自伤风险 -->
+              <tr>
+                <td class="col-factor">他伤及自伤风险</td>
+                <td class="col-standard">
+                  <el-radio-group v-model="form.assessment.scores[4]" :disabled="isDetail" @change="calculateTotal">
+                    <el-radio :label="0">轻度风险=0</el-radio>
+                    <el-radio :label="1">中度风险=1</el-radio>
+                    <el-radio :label="5">重度风险=5</el-radio>
+                  </el-radio-group>
+                </td>
+                <td class="col-score">{{ form.assessment.scores[4] ?? '-' }}</td>
+              </tr>
+
+              <!-- 参加活动老年人之间是否发生过矛盾冲突 -->
+              <tr>
+                <td class="col-factor">参加活动老年人之间是否发生过矛盾冲突</td>
+                <td class="col-standard">
+                  <el-radio-group v-model="form.assessment.scores[5]" :disabled="isDetail" @change="calculateTotal">
+                    <el-radio :label="3">是=3</el-radio>
+                    <el-radio :label="0">否=0</el-radio>
+                  </el-radio-group>
+                </td>
+                <td class="col-score">{{ form.assessment.scores[5] ?? '-' }}</td>
+              </tr>
+
+              <!-- 评估总分 -->
+              <tr>
+                <td class="col-factor" colspan="2" style="text-align: center; font-weight: bold;">评估总分</td>
+                <td class="col-score">{{ form.assessment.totalScore }}</td>
+              </tr>
+
+              <!-- 综合风险评级 -->
+              <tr>
+                <td class="col-factor" colspan="2" style="text-align: center; font-weight: bold;">综合风险评级</td>
+                <td class="col-score">{{ getRiskText(form.riskLevel) }}</td>
+              </tr>
+            </tbody>
+          </table>
+        </div>
+
+        <!-- 评价标准 -->
+        <div class="evaluation-standard">
+          <div class="standard-title">评价标准:</div>
+          <div class="standard-content">
+            0分为无风险;≤7分为低风险;8-11分为中风险;≥12分为高风险。
+          </div>
+        </div>
+
+        <!-- 备注 -->
+        <div class="remarks-section">
+          <div class="remarks-title">备注:</div>
+          <div class="remarks-content">
+            <div class="remark-item">1、制定适合不同风险等级的老年人活动,并做好风险防范措施;</div>
+            <div class="remark-item">2、选择安全的文娱活动场所,地面应要防滑、平整,墙壁边角和家具边应做好防护处理;</div>
+            <div class="remark-item">3、准确评估老年人的活动耐受力,忌做刺激性强的、运动强度高的活动;</div>
+            <div class="remark-item">4、文娱活动时间不宜过长,建议1小时以内为宜;</div>
+            <div class="remark-item">5、参加活动时,必须要有工作人员陪同。</div>
+          </div>
+        </div>
+
+        <!-- 风险程度判断 -->
+        <div class="risk-level-section">
+          <div class="risk-level-title">风险程度判断:</div>
+          <div class="risk-level-options">
+            <div class="risk-option" :class="{ active: form.riskLevel === 'none' }">
+              <el-radio v-model="form.riskLevel" label="none" :disabled="isDetail">
+                无风险:0分
+              </el-radio>
+            </div>
+            <div class="risk-option" :class="{ active: form.riskLevel === 'low' }">
+              <el-radio v-model="form.riskLevel" label="low" :disabled="isDetail">
+                低风险:I级
+              </el-radio>
+            </div>
+            <div class="risk-option" :class="{ active: form.riskLevel === 'medium' }">
+              <el-radio v-model="form.riskLevel" label="medium" :disabled="isDetail">
+                中风险:II级
+              </el-radio>
+            </div>
+            <div class="risk-option" :class="{ active: form.riskLevel === 'high' }">
+              <el-radio v-model="form.riskLevel" label="high" :disabled="isDetail">
+                高风险:III级、IV级
+              </el-radio>
+            </div>
+            <div class="risk-option score-display">
+              <span class="score-label">评估总得分:</span>
+              <span class="score-value">{{ form.assessment.totalScore }} 分</span>
+            </div>
+          </div>
+        </div>
+
+        <!-- 评估记录 -->
+        <div class="assessment-records">
+          <div class="record-section">
+            <div class="record-header">评估记录</div>
+            <el-row :gutter="20">
+              <el-col :span="12">
+                <el-form-item label="评估人">
+                  <el-input v-model="form.assessment.assessor" placeholder="请输入评估人" :disabled="isDetail" />
+                </el-form-item>
+              </el-col>
+              <el-col :span="12">
+                <el-form-item label="评估日期">
+                  <el-date-picker
+                    v-model="form.assessment.assessDate"
+                    type="date"
+                    placeholder="选择日期"
+                    value-format="YYYY-MM-DD"
+                    :disabled="isDetail"
+                    style="width: 100%"
+                  />
+                </el-form-item>
+              </el-col>
+          
+            </el-row>
+          </div>
+        </div>
+      </div>
+
+
+    </div>
+
+    <template #footer>
+      <el-button @click="handleClosed">关闭</el-button>
+     <el-button v-if="isDetail" type="success" @click="handleExport">打印</el-button>
+      <el-button
+        style="margin-left: 22px;margin-right: 30px" v-loading="formLoading" type="primary"
+        v-show="!isDetail" @click="submitForm">确定</el-button>
+    </template>
+  </el-drawer>
+</template>
+
+<script lang="ts" setup>
+import { computed, ref, reactive } from 'vue'
+import dayjs from 'dayjs'
+import {
+  fallDownCreate,
+  fallDownGetById,
+  fallDownUpdate
+} from "@/api/social-work";
+
+const message = useMessage()
+const { t } = useI18n()
+const title = ref('')
+const dialogVisible = ref(false)
+const formRef = ref()
+const selectElderRef = ref()
+const isDetail = ref(false)
+const formLoading = ref(false)
+
+let dataForm = ref({
+  id: undefined,
+  elderName: '',
+  elderSex: '',
+  elderAge: '',
+  bedName: '',
+  elderId: '',
+  tenantId: undefined
+})
+
+const elderUp = (e: any) => {
+  console.log(e)
+  dataForm.value.elderName = e.elderName
+  dataForm.value.elderId = e.id
+  dataForm.value.elderSex = e.elderSex === 1 ? '男' : '女'
+  dataForm.value.bedName = e.bedName || ''
+  dataForm.value.elderAge = e.elderAge
+}
+
+// 表单数据
+const form = reactive({
+  assessment: {
+    assessDate: '',
+    assessor: '',
+    scores: new Array(6).fill(0),
+    totalScore: 0
+  },
+  riskLevel: ''
+})
+
+// 计算总得分
+const calculateTotal = () => {
+  const scores = form.assessment.scores
+  const total = scores.reduce((sum, score) => sum + (score || 0), 0)
+  form.assessment.totalScore = total
+
+  // 自动判断风险等级 (0分为无风险,≤7分为低风险;8-11分为中风险;≥12分为高风险)
+  if (total === 0) {
+    form.riskLevel = 'none'
+  } else if (total <= 7) {
+    form.riskLevel = 'low'
+  } else if (total >= 8 && total <= 11) {
+    form.riskLevel = 'medium'
+  } else if (total >= 12) {
+    form.riskLevel = 'high'
+  }
+}
+
+// 获取风险等级文本
+const getRiskText = (riskLevel: string) => {
+  switch (riskLevel) {
+    case 'none': return '无风险'
+    case 'low': return '低风险'
+    case 'medium': return '中风险'
+    case 'high': return '高风险'
+    default: return '-'
+  }
+}
+
+// 获取风险等级标签类型
+const getRiskTagType = (riskLevel: string) => {
+  switch (riskLevel) {
+    case 'none': return 'info'
+    case 'low': return 'success'
+    case 'medium': return 'warning'
+    case 'high': return 'danger'
+    default: return ''
+  }
+}
+
+/** 将表单数据序列化为 JSON 对象 */
+const serializeFormData = () => {
+  return {
+    assessment: {
+      assessDate: form.assessment.assessDate ? dayjs(form.assessment.assessDate).format('YYYY-MM-DD') : '',
+      assessor: form.assessment.assessor || '',
+      scores: form.assessment.scores || [],
+      totalScore: form.assessment.totalScore || 0
+    },
+    riskLevel: form.riskLevel
+  }
+}
+
+/** 将 JSON 对象反序列化为表单数据 */
+const deserializeFormData = (formData: Record<string, any>) => {
+  if (!formData) return
+
+  if (formData.assessment) {
+    form.assessment.assessDate = formData.assessment.assessDate || ''
+    form.assessment.assessor = formData.assessment.assessor || ''
+    form.assessment.scores = formData.assessment.scores || new Array(6).fill(0)
+    form.assessment.totalScore = formData.assessment.totalScore || 0
+  }
+  form.riskLevel = formData.riskLevel || ''
+}
+
+/** 重置表单数据 */
+const resetForm = () => {
+  dataForm.value = {
+    id: undefined,
+    elderName: '',
+    elderSex: '',
+    elderAge: '',
+    bedName: '',
+    elderId: '',
+    tenantId: undefined
+  }
+  formRef.value?.resetFields()
+
+  form.assessment = {
+    assessDate: '',
+    assessor: '',
+    scores: new Array(6).fill(0),
+    totalScore: 0
+  }
+  form.riskLevel = ''
+}
+
+/** 打开弹窗 */
+const open = async (tenantId: any, id?: any, detail: boolean = false) => {
+  resetForm()
+  dialogVisible.value = true
+  dataForm.value.id = id || undefined
+  dataForm.value.tenantId = tenantId
+  isDetail.value = detail
+  if (id) {
+    title.value = "编辑-跌倒风险评估表"
+    await loadData(id)
+  } else {
+    title.value = "新增-跌倒风险评估表"
+  }
+}
+
+/** 加载评估数据 */
+const loadData = async (id: number) => {
+  try {
+    const res = await fallDownGetById(id)
+    if (res) {
+      dataForm.value.elderName = res.elderName || ''
+      dataForm.value.elderId = res.elderId || ''
+      dataForm.value.elderSex = res.elderSex || ''
+      dataForm.value.bedName = res.bedName || ''
+      dataForm.value.elderAge = res.elderAge || ''
+      await selectElderRef.value.upData(res.elderName, res.elderId)
+      
+      // 优先从独立字段获取评估人和评估日期
+      if (res.assessor) {
+        form.assessment.assessor = res.assessor
+      }
+      if (res.assessDate) {
+        form.assessment.assessDate = res.assessDate
+      }
+      
+      if (res.assessData) {
+        const formData = JSON.parse(res.assessData)
+        deserializeFormData(formData)
+        // assessData中的assessor和assessDate会覆盖独立字段的值(如果存在)
+      }
+    }
+  } catch (error) {
+    message.error('加载评估数据失败')
+  }
+}
+
+defineExpose({ open })
+
+const emit = defineEmits(['success'])
+
+/** 提交表单 */
+const submitForm = async () => {
+  if (!dataForm.value.elderId) {
+    message.error('请选择长者')
+    return
+  }
+
+  formLoading.value = true
+  try {
+    const formData = serializeFormData()
+    const payload = {
+      id: dataForm.value.id,
+      elderId: dataForm.value.elderId,
+      tenantId: dataForm.value.tenantId,
+      elderName: dataForm.value.elderName,
+      elderSex: dataForm.value.elderSex,
+      elderAge: dataForm.value.elderAge,
+      bedName: dataForm.value.bedName,
+      assessData: JSON.stringify(formData),
+      riskLevel: form.riskLevel,
+      assessScore: form.assessment.totalScore || 0,
+      assessor: form.assessment.assessor,
+      assessDate: form.assessment.assessDate ? dayjs(form.assessment.assessDate).format('YYYY-MM-DD') : ''
+    }
+
+    if (dataForm.value.id) {
+      await fallDownUpdate(payload)
+      message.success(t('common.updateSuccess'))
+    } else {
+      await fallDownCreate(payload)
+      message.success(t('common.createSuccess'))
+    }
+    dialogVisible.value = false
+    emit('success')
+  } catch (error) {
+    message.error('提交失败')
+  } finally {
+    formLoading.value = false
+  }
+}
+
+/** 关闭弹窗 */
+const handleClosed = () => {
+  dialogVisible.value = false
+}
+
+/** 导出/打印 */
+const handleExport = () => {
+  // 创建打印窗口
+  const printWindow = window.open('', '_blank')
+  if (!printWindow) {
+    message.error('请允许弹出窗口')
+    return
+  }
+
+  // 评估项目数据
+  const assessmentItems = [
+    { 
+      factor: '身体健康状况基础疾病', 
+      options: [
+        { label: '两项疾病以上(>2项)=2分+不适合=5分', value: 5 },
+        { label: '两项疾病以下(≤2项)=1分+适合=0分', value: 1 },
+        { label: '两项疾病以上(>2项)2分+身体适合0分=2分', value: 2 },
+        { label: '两项疾病以下(≤2项)1分+身体不适合5分=6分', value: 6 }
+      ], 
+      score: form.assessment.scores[0] 
+    },
+    { 
+      factor: '跌倒风险与行动能力', 
+      options: [
+        { label: '高风险=5分+完全依赖=3分', value: 8 },
+        { label: '中风险=1分+需要协助=2分', value: 3 },
+        { label: '低风险=0分+正常=0分', value: 0 }
+      ], 
+      score: form.assessment.scores[1] 
+    },
+    { 
+      factor: '走失风险与认知能力', 
+      options: [
+        { label: '高风险=5分+确诊认知功能障碍=3分', value: 8 },
+        { label: '中风险=1分+疑似认知功能障碍=2分', value: 3 },
+        { label: '低风险=0分+无认知功能障碍=0分', value: 0 }
+      ], 
+      score: form.assessment.scores[2] 
+    },
+    { 
+      factor: '心理健康状况', 
+      options: [
+        { label: '状况很差=3分+抑郁=3分', value: 6 },
+        { label: '状况较差=1分+冷漠=2分', value: 3 },
+        { label: '状况良好(正常)=0', value: 0 }
+      ], 
+      score: form.assessment.scores[3] 
+    },
+    { 
+      factor: '他伤及自伤风险', 
+      options: [
+        { label: '轻度风险=0', value: 0 },
+        { label: '中度风险=1', value: 1 },
+        { label: '重度风险=5', value: 5 }
+      ], 
+      score: form.assessment.scores[4] 
+    },
+    { 
+      factor: '参加活动老年人之间是否发生过矛盾冲突', 
+      options: [
+        { label: '是=3', value: 3 },
+        { label: '否=0', value: 0 }
+      ], 
+      score: form.assessment.scores[5] 
+    }
+  ]
+
+  // 构建打印内容
+  const printContent = `
+    <!DOCTYPE html>
+    <html>
+    <head>
+      <meta charset="UTF-8">
+      <title>跌倒风险评估表 - ${dataForm.value.elderName || ''}</title>
+      <style>
+        @media print {
+          @page { size: A4 portrait; margin: 15mm; }
+        }
+        body {
+          font-family: 'SimSun', 'Microsoft YaHei', serif;
+          font-size: 10pt;
+          line-height: 1.4;
+          color: #333;
+        }
+        .header {
+          text-align: center;
+          margin-bottom: 15px;
+          border-bottom: 2px solid #333;
+          padding-bottom: 10px;
+        }
+        .header h1 {
+          font-size: 16pt;
+          margin: 0;
+          letter-spacing: 2px;
+        }
+        .info-section {
+          margin-bottom: 15px;
+          padding: 10px;
+          border: 1px solid #999;
+          background: #fafafa;
+        }
+        .info-row {
+          display: flex;
+          flex-wrap: wrap;
+          gap: 20px;
+        }
+        .info-item {
+          display: flex;
+          align-items: center;
+        }
+        .info-item .label {
+          font-weight: bold;
+          margin-right: 8px;
+          color: #555;
+        }
+        .info-item .value {
+          border-bottom: 1px solid #333;
+          min-width: 80px;
+          padding: 0 5px;
+          text-align: center;
+        }
+
+        .assessment-table {
+          width: 100%;
+          border-collapse: collapse;
+          margin-bottom: 15px;
+        }
+        .assessment-table th, .assessment-table td {
+          border: 1px solid #333;
+          padding: 8px;
+          text-align: left;
+          vertical-align: top;
+        }
+        .assessment-table th {
+          background: #e8e8e8;
+          font-weight: bold;
+          text-align: center;
+        }
+        .assessment-table .col-factor {
+          width: 15%;
+          text-align: center;
+          font-weight: bold;
+          background: #f5f5f5;
+        }
+        .assessment-table .col-standard {
+          width: 70%;
+        }
+        .assessment-table .col-score {
+          width: 15%;
+          text-align: center;
+          font-weight: bold;
+        }
+
+        .risk-judgment-section {
+          margin: 15px 0;
+          padding: 10px;
+          border: 1px solid #999;
+        }
+        .risk-judgment-title {
+          font-weight: bold;
+          margin-bottom: 10px;
+        }
+        .risk-options {
+          display: flex;
+          flex-wrap: wrap;
+          gap: 15px;
+        }
+        .risk-option {
+          display: inline-block;
+        }
+
+        .record-section {
+          margin: 15px 0;
+          padding: 10px;
+          border: 1px solid #999;
+        }
+        .record-title {
+          font-weight: bold;
+          margin-bottom: 10px;
+          border-bottom: 1px solid #ccc;
+          padding-bottom: 5px;
+        }
+        .record-row {
+          display: flex;
+          gap: 30px;
+          margin-bottom: 8px;
+        }
+        .record-item {
+          display: flex;
+          align-items: center;
+        }
+        .record-item .label {
+          font-weight: bold;
+          margin-right: 8px;
+        }
+        .record-item .value {
+          border-bottom: 1px solid #333;
+          min-width: 180px;
+          padding: 0 5px;
+          text-align: center;
+        }
+        .score-value {
+          color: #d9534f;
+          font-weight: bold;
+          font-size: 14pt;
+        }
+
+        .prevention-section {
+          margin: 15px 0;
+          border: 1px solid #999;
+        }
+        .prevention-title {
+          font-weight: bold;
+          background: #e8e8e8;
+          padding: 8px 12px;
+          border-bottom: 1px solid #999;
+        }
+        .prevention-content {
+          padding: 10px 12px;
+        }
+        .prevention-item {
+          margin-bottom: 8px;
+          font-size: 10pt;
+        }
+      </style>
+    </head>
+    <body>
+      <div class="header">
+        <h1>跌倒风险评估表</h1>
+      </div>
+
+      <div class="info-section">
+        <div class="info-row">
+          <div class="info-item">
+            <span class="label">长者姓名:</span>
+            <span class="value">${dataForm.value.elderName || ''}</span>
+          </div>
+          <div class="info-item">
+            <span class="label">性别:</span>
+            <span class="value">${dataForm.value.elderSex || ''}</span>
+          </div>
+          <div class="info-item">
+            <span class="label">年龄:</span>
+            <span class="value">${dataForm.value.elderAge || ''}</span>
+          </div>
+          <div class="info-item">
+            <span class="label">房号/床号:</span>
+            <span class="value">${dataForm.value.bedName || ''}</span>
+          </div>
+        </div>
+      </div>
+
+      <!-- 危险因素评估表 -->
+      <table class="assessment-table">
+        <thead>
+          <tr>
+            <th class="col-factor">危险因素</th>
+            <th class="col-standard">评估标准(分)</th>
+            <th class="col-score">得分</th>
+          </tr>
+        </thead>
+        <tbody>
+          ${assessmentItems.map(item => `
+            <tr>
+              <td class="col-factor">${item.factor}</td>
+              <td class="col-standard">
+                ${item.options.map(opt => `${item.score === opt.value ? '☑' : '☐'} ${opt.label}=${opt.value}`).join('&nbsp;&nbsp;&nbsp;&nbsp;')}
+              </td>
+              <td class="col-score">${item.score}</td>
+            </tr>
+          `).join('')}
+        </tbody>
+      </table>
+
+      <!-- 评价标准 -->
+      <div class="evaluation-standard-section">
+        <div class="evaluation-title">评价标准:0分为无风险;≤7分为低风险;8-11分为中风险;≥12分为高风险。</div>
+      </div>
+
+      <!-- 备注 -->
+      <div class="remarks-section">
+        <div class="remarks-title">备注:</div>
+        <div class="remarks-content">
+          <div class="remark-item">1、制定适合不同风险等级的老年人活动,并做好风险防范措施;</div>
+          <div class="remark-item">2、选择安全的文娱活动场所,地面应要防滑、平整,墙壁边角和家具边应做好防护处理;</div>
+          <div class="remark-item">3、准确评估老年人的活动耐受力,忌做刺激性强的、运动强度高的活动;</div>
+          <div class="remark-item">4、文娱活动时间不宜过长,建议1小时以内为宜;</div>
+          <div class="remark-item">5、参加活动时,必须要有工作人员陪同。</div>
+        </div>
+      </div>
+
+      <!-- 风险程度判断 -->
+      <div class="risk-judgment-section">
+        <div class="risk-judgment-title">风险程度判断:</div>
+        <div class="risk-options">
+          <span class="risk-option">${form.riskLevel === 'none' ? '☑' : '☐'} 无风险:0分</span>
+          <span class="risk-option">${form.riskLevel === 'low' ? '☑' : '☐'} 低风险:I级</span>
+          <span class="risk-option">${form.riskLevel === 'medium' ? '☑' : '☐'} 中风险:II级</span>
+          <span class="risk-option">${form.riskLevel === 'high' ? '☑' : '☐'} 高风险:III级、IV级</span>
+          <span class="risk-option score-display"><strong>评估总得分:${form.assessment.totalScore} 分</strong></span>
+        </div>
+      </div>
+
+      <!-- 评估记录 -->
+      <div class="record-section">
+        <div class="record-title">评估记录</div>
+        <div class="record-row">
+          <div class="record-item">
+            <span class="label">评估人签名:</span>
+            <span class="value">${form.assessment.assessor || ''}</span>
+          </div>
+          <div class="record-item">
+            <span class="label">评估日期:</span>
+            <span class="value">${form.assessment.assessDate || ''}</span>
+          </div>
+        </div>
+      </div>
+
+
+    </body>
+    </html>
+  `
+
+  // 写入内容并打印
+  printWindow.document.write(printContent)
+  printWindow.document.close()
+
+  // 延迟打印,确保样式加载完成
+  setTimeout(() => {
+    printWindow.print()
+  }, 500)
+}
+
+const rules = {
+  elderName: [{ required: true, message: '请选择长者', trigger: 'change' }]
+}
+</script>
+
+<style scoped lang="scss">
+.assessment-form {
+  padding: 0 20px;
+
+  .form-header {
+    margin-bottom: 20px;
+  }
+
+  .risk-factors-section {
+    margin-bottom: 20px;
+
+    .section-title {
+      font-size: 16px;
+      font-weight: bold;
+      margin-bottom: 15px;
+      color: #333;
+      border-left: 4px solid #409eff;
+      padding-left: 10px;
+    }
+
+    .table-wrapper {
+          border: 2px solid #333;
+          border-radius: 4px;
+          overflow: hidden;
+        }
+
+        .assessment-table {
+          width: 100%;
+          border-collapse: collapse;
+
+          th, td {
+            padding: 12px;
+            border: 1px solid #e4e7ed;
+          }
+
+          thead {
+            background-color: #f5f7fa;
+            font-weight: bold;
+
+            th {
+              border-bottom: 2px solid #333;
+            }
+          }
+
+          tbody {
+            tr:last-child {
+              td {
+                border-bottom: none;
+              }
+            }
+          }
+
+          .col-factor {
+            width: 20%;
+            text-align: center;
+            font-weight: bold;
+            border-right: 1px solid #e4e7ed;
+          }
+
+          .col-standard {
+            width: 65%;
+            text-align: left;
+            border-right: 1px solid #e4e7ed;
+
+            .el-radio-group {
+              display: flex;
+              flex-wrap: wrap;
+              gap: 20px;
+
+              .el-radio {
+                margin-right: 0;
+                height: 24px;
+              }
+            }
+
+            &.empty-row {
+              padding: 4px;
+            }
+          }
+
+          .col-score {
+            width: 15%;
+            text-align: center;
+            font-weight: bold;
+            color: #409eff;
+            font-size: 16px;
+          }
+        }
+
+        .evaluation-standard {
+          margin-top: 15px;
+          padding: 15px;
+          background-color: #f5f7fa;
+          border-radius: 4px;
+          border: 1px solid #e4e7ed;
+
+          .standard-title {
+            font-weight: bold;
+            margin-bottom: 5px;
+          }
+
+          .standard-content {
+            color: #606266;
+          }
+        }
+
+        .remarks-section {
+          margin-top: 15px;
+          padding: 15px;
+          background-color: #fff;
+          border: 1px solid #e4e7ed;
+          border-radius: 4px;
+
+          .remarks-title {
+            font-weight: bold;
+            margin-bottom: 10px;
+            color: #333;
+          }
+
+          .remarks-content {
+            .remark-item {
+              margin-bottom: 5px;
+              color: #606266;
+              line-height: 1.6;
+            }
+          }
+        }
+
+        .risk-level-section {
+          margin-top: 20px;
+          padding: 15px;
+          background-color: #f5f7fa;
+          border: 1px solid #e4e7ed;
+          border-radius: 4px;
+
+          .risk-level-title {
+            font-size: 14px;
+            font-weight: bold;
+            margin-bottom: 10px;
+            color: #333;
+          }
+
+          .risk-level-options {
+            display: flex;
+            flex-wrap: wrap;
+            gap: 30px;
+            align-items: center;
+
+            .risk-option {
+              .el-radio {
+                margin-right: 0;
+              }
+
+              &.score-display {
+                margin-left: auto;
+                display: flex;
+                align-items: center;
+                gap: 8px;
+
+                .score-label {
+                  font-weight: bold;
+                  color: #333;
+                }
+
+                .score-value {
+                  font-size: 18px;
+                  font-weight: bold;
+                  color: #409eff;
+                }
+              }
+            }
+          }
+        }
+      }
+
+  .assessment-records {
+    margin-top: 20px;
+
+    .record-section {
+      margin-bottom: 20px;
+      padding: 15px;
+      border: 1px solid #e4e7ed;
+      border-radius: 4px;
+
+      .record-header {
+        font-size: 14px;
+        font-weight: bold;
+        margin-bottom: 15px;
+        color: #409eff;
+        border-bottom: 1px solid #e4e7ed;
+        padding-bottom: 10px;
+      }
+
+      .score-text {
+        font-size: 16px;
+        font-weight: bold;
+        color: #409eff;
+      }
+    }
+  }
+
+  .prevention-section {
+    margin-top: 20px;
+
+    .section-title {
+      font-size: 16px;
+      font-weight: bold;
+      margin-bottom: 15px;
+      color: #333;
+      border-left: 4px solid #409eff;
+      padding-left: 10px;
+    }
+
+    .prevention-group {
+      display: flex;
+      flex-direction: column;
+      gap: 10px;
+
+      .el-checkbox {
+        margin-bottom: 10px;
+        margin-right: 20px;
+      }
+    }
+  }
+
+  .evaluation-standard-section {
+    margin-top: 20px;
+    padding: 15px;
+    background-color: #f5f7fa;
+    border: 1px solid #e4e7ed;
+    border-radius: 4px;
+
+    .evaluation-title {
+      font-weight: bold;
+      color: #333;
+    }
+  }
+
+  .remarks-section {
+    margin-top: 20px;
+    padding: 15px;
+    background-color: #fff;
+    border: 1px solid #e4e7ed;
+    border-radius: 4px;
+
+    .remarks-title {
+      font-size: 16px;
+      font-weight: bold;
+      margin-bottom: 15px;
+      color: #333;
+      border-left: 4px solid #409eff;
+      padding-left: 10px;
+    }
+
+    .remarks-content {
+      .remark-item {
+        margin-bottom: 8px;
+        color: #606266;
+        line-height: 1.6;
+      }
+    }
+  }
+      .el-checkbox {
+        margin-bottom: 10px;
+        margin-right: 20px;
+      }
+    }
+
+
+  .api-params-section {
+    margin-top: 30px;
+    padding: 20px;
+    background-color: #f5f7fa;
+    border: 1px solid #e4e7ed;
+    border-radius: 4px;
+
+    .section-title {
+      font-size: 16px;
+      font-weight: bold;
+      margin-bottom: 15px;
+      color: #333;
+      border-left: 4px solid #67c23a;
+      padding-left: 10px;
+    }
+
+    .risk-rules {
+      margin-top: 15px;
+      padding: 10px;
+      background-color: #fff;
+      border-radius: 4px;
+
+      .rules-title {
+        font-weight: bold;
+        margin-bottom: 10px;
+        color: #606266;
+      }
+
+      .rule-tag {
+        margin-right: 10px;
+        margin-bottom: 5px;
+      }
+    }
+  }
+
+</style>

+ 284 - 0
src/views/elderly/apply/nine-precautions/anti-entertainment/index.vue

@@ -0,0 +1,284 @@
+<template>
+  <ContentWrap>
+    <!-- 跌倒风险评估表 -->
+    <el-form
+      class="-mb-15px"
+      :model="queryParams"
+      ref="queryFormRef"
+      :inline="true"
+      label-width="110px"
+    >
+      <el-form-item label="长者姓名">
+        <el-input
+          v-model="queryParams.elderName"
+          placeholder="长者姓名"
+          class="!w-240px"
+          clearable
+        />
+      </el-form-item>
+
+      <el-form-item label="评估人">
+        <el-input
+          v-model="queryParams.assessor"
+          placeholder="评估人"
+          class="!w-240px"
+          clearable
+        />
+      </el-form-item>
+
+      <el-form-item label="记录日期">
+        <el-date-picker
+          size="default"
+          ref="selectRef"
+          class="!w-240px"
+          v-model="queryParams.assessDate"
+          type="daterange"
+          :clearable="true"
+          :editable="false"
+          placeholder="选择记录日期"
+          value-format="YYYY-MM-DD"
+          format="YYYY-MM-DD"
+          date-format="YYYY-MM-DD"
+        />
+      </el-form-item>
+
+      <el-form-item>
+        <el-button @click="handleQuery" style="margin-left: 2vw"><Icon icon="ep:search" class="mr-5px" /> 搜索</el-button>
+        <el-button @click="resetQuery"><Icon icon="ep:refresh" class="mr-5px" /> 重置</el-button>
+      </el-form-item>
+    </el-form>
+  </ContentWrap>
+
+  <!-- 列表 -->
+  <ContentWrap>
+    <div class="mb-10px">
+      <ButtonAdd @click="openForm(undefined)" />
+    </div>
+    <el-table v-loading="loading" :data="list" :header-cell-style="tableHeaderColor">
+      <el-table-column header-align="center" align="center" label="序号" width="60">
+        <template #default="scope">
+          {{
+            scope.$index + (queryParams.pageNo * queryParams.pageSize - queryParams.pageSize) + 1
+          }}
+        </template>
+      </el-table-column>
+
+      <el-table-column prop="elderName" header-align="center" align="center" label="长者姓名" min-width="150" show-overflow-tooltip/>
+      <el-table-column prop="assessor" header-align="center" align="center" label="评估人" min-width="150" show-overflow-tooltip/>
+      <el-table-column prop="assessDate" header-align="center" align="center" label="记录日期" min-width="150" show-overflow-tooltip/>
+      <el-table-column prop="assessScore" header-align="center" align="center" label="评估总得分" min-width="120" show-overflow-tooltip/>
+      <el-table-column prop="riskLevel" header-align="center" align="center" label="风险等级" min-width="120" show-overflow-tooltip>
+        <template #default="scope">
+          <el-tag :type="getRiskLevelType(scope.row.riskLevel)">
+            {{ getRiskLevelText(scope.row.riskLevel) }}
+          </el-tag>
+        </template>
+      </el-table-column>
+      <el-table-column prop="creator" header-align="center" align="center" label="记录人" min-width="150" show-overflow-tooltip/>
+
+      <el-table-column label="操作" align="center" width="200">
+        <template #default="scope">
+          <el-button
+            link
+            type="primary"
+            @click="openFormEdit(scope.row, scope.row.id)"
+          >
+            编辑
+          </el-button>
+          <el-button
+            link
+            type="warning"
+            @click="openFormDetail(scope.row,scope.row.id)"
+          >
+            详情
+          </el-button>
+          <el-button
+            link
+            type="danger"
+            @click="openClose(scope.row)"
+          >
+            删除
+          </el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+    <!-- 分页 -->
+    <Pagination
+      :total="total"
+      v-model:page="queryParams.pageNo"
+      v-model:limit="queryParams.pageSize"
+      @pagination="getList"
+    />
+  </ContentWrap>
+
+  <AddForm ref="formRef" @success="getList" />
+
+
+</template>
+
+<script setup lang="ts">
+import AddForm from "./AddForm.vue";
+import ButtonAdd from "@/components/ButtonAdd/src/ButtonAdd.vue";
+import { useUserStore } from '@/store/modules/user'
+import { getCurrentMonthRange } from "@/utils/dateUtil";
+import {
+  fallDownDelete,
+  fallDownPage
+} from "@/api/social-work";
+
+const message = useMessage()
+const { t } = useI18n()
+const userStore = useUserStore()
+const loading = ref(true)
+const total = ref(0)
+const list = ref([])
+
+// 状态管理
+const showBatchExport = ref(false)
+const exportConfig = ref({
+  title: '',
+  batchMin: 1,
+  batchMax: 999,
+  countMin: 1,
+  countMax: 200,
+  defaultBatch: 1,
+  defaultCount: 200,
+  description: [] as string[]
+})
+const exportLoading = ref(false)
+
+let queryParams = reactive({
+  pageNo: 1,
+  pageSize: 10,
+  elderName: '',
+  assessor: '',
+  // assessDate: getCurrentMonthRange(),
+  assessDate: [],
+  tenantIds: userStore.orgTenantId
+})
+const queryFormRef = ref()
+
+// 处理批量导出
+const handleBatchExport = async (batch: number, count: number) => {
+  exportLoading.value = true
+  console.log(batch, count)
+}
+
+/** 查询列表 */
+const getList = async () => {
+  loading.value = true
+  try {
+    const data = await fallDownPage(queryParams)
+    list.value = data.list
+    total.value = data.total
+  } finally {
+    loading.value = false
+  }
+}
+
+/** 搜索按钮操作 */
+const handleQuery = async () => {
+  if (!queryFormRef.value) return
+  const valid = await queryFormRef.value.validate()
+  if (!valid) return
+  queryParams.pageNo = 1
+  await getList()
+}
+
+/** 重置按钮操作 */
+const resetQuery = () => {
+  queryParams.elderName = ''
+  queryParams.assessor = ''
+  queryParams.tenantIds = userStore.orgTenantId
+  // queryParams.assessDate = getCurrentMonthRange()
+  queryParams.assessDate = []
+  queryFormRef.value.resetFields()
+  handleQuery()
+}
+
+/** 添加/修改操作 */
+const formRef = ref()
+const openForm = (id?: number) => {
+  if (queryParams.tenantIds.length == 0 || queryParams.tenantIds.length > 1) {
+    message.error('新增只能选择一个机构')
+    return
+  }
+  formRef.value.open(queryParams.tenantIds[0], id, false)
+}
+
+const openFormEdit = (row: any = {}, id?: number) => {
+  formRef.value.open(row.tenantId, id, false)
+}
+
+const openFormDetail = (row: any = {}, id?: number) => {
+  formRef.value.open(row.tenantId, id, true)
+}
+
+const openClose = async (item: any) => {
+  try {
+    const res = await message.confirm('确定要删除吗?', '提示')
+    if (res == 'confirm') {
+      try {
+        const res = await fallDownDelete(item.id)
+        if (res) {
+          message.success(t('common.updateSuccess'))
+          await getList()
+        }
+      } catch (err) { }
+    }
+  } catch { }
+}
+
+/** 取消按钮操作 */
+const cancelDelete = async (id: number) => {
+  try {
+    await message.cancelConfirm()
+    message.success(t('common.delSuccess'))
+    await getList()
+  } catch { }
+}
+
+const route = useRoute()
+/** 初始化 **/
+onMounted(() => {
+  if (route.query && route.query.elderName) {
+    queryParams.elderName = route.query.elderName as string
+  }
+  getList()
+})
+
+// 表头格式
+const tableHeaderColor = ({ rowIndex }: any) => {
+  if (rowIndex === 0) {
+    return {
+      backgroundColor: '#f8f8f9',
+      color: '#666666',
+      fontWeight: 'bold'
+    }
+  }
+}
+
+// 获取风险等级类型
+const getRiskLevelType = (riskLevel: string) => {
+  switch (riskLevel) {
+    case 'none': return 'success'
+    case 'low': return 'info'
+    case 'medium': return 'warning'
+    case 'high': return 'danger'
+    default: return ''
+  }
+}
+
+// 获取风险等级文本
+const getRiskLevelText = (riskLevel: string) => {
+  switch (riskLevel) {
+    case 'none': return '无风险'
+    case 'low': return '低风险'
+    case 'medium': return '中风险'
+    case 'high': return '高风险'
+    default: return '-'
+  }
+}
+</script>
+
+<style scoped lang="scss"></style>

+ 4 - 4
src/views/elderly/apply/nine-precautions/attack/AddForm.vue

@@ -143,13 +143,13 @@
                   <div class="content-item">(2) 攻击行为在一天内至少出现两次以上或攻击行为造成了他人肉体上的伤害</div>
                 </td>
                 <td class="level" rowspan="2">IV级</td>
-                <td class="select" rowspan="7">
+                <td class="select" rowspan="2">
                   <el-radio-group v-model="form.attackLevel" :disabled="isDetail" @change="handleLevelChange">
-                    <el-radio :value="1">  符合</el-radio>
+                    <el-radio :value="4">  符合</el-radio>
                   </el-radio-group>
                   <div class="multi-select">
-                    <el-checkbox-group v-model="form.attackLevel1Items" :disabled="isDetail || form.attackLevel !== 1">
-                      <el-checkbox v-for="n in 7" :key="n" :value="n">{{ n }}</el-checkbox>
+                    <el-checkbox-group v-model="form.attackLevel4Items" :disabled="isDetail || form.attackLevel !== 4">
+                      <el-checkbox v-for="n in 2" :key="n" :value="n">{{ n }}</el-checkbox>
                     </el-checkbox-group>
                   </div>
                 </td>

+ 18 - 10
src/views/elderly/apply/nine-precautions/communication/AddForm.vue

@@ -113,7 +113,11 @@
         <!-- 备注 -->
         <div class="remark-section">
           <span class="remark-label">备注:</span>
-          <span class="remark-text">若平日戴老花镜或近视镜,应在佩戴眼镜的情况下评估。</span>
+          <div style="flex-direction: column;display: flex;justify-content: center;">
+            <span class="remark-text">1.若平日戴老花镜或近视镜,应在佩戴眼镜的情况下评估。</span>
+            <span class="remark-text">2.风险程度判断:无风险:0分;低风险:1分;中风险:2分,高风险:≥3分。</span>
+            <span class="remark-text">3.院内老人均需进行简易精神状态评价量表(MMSE),如老人存在视觉异常需增加《感知觉与沟通评估表》,两表同时使用时按分高为最终评估结果。</span>
+          </div>
         </div>
 
         <!-- 风险程度判断 -->
@@ -121,16 +125,16 @@
           <div class="risk-judgment-title">风险程度判断:</div>
           <div class="risk-options">
             <el-radio v-model="form.riskLevel" label="none" :disabled="isDetail">
-                无风险:0分
+                无风险
             </el-radio>
             <el-radio v-model="form.riskLevel" label="low" :disabled="isDetail">
-                低风险:1分
+                低风险
             </el-radio>
             <el-radio v-model="form.riskLevel" label="medium" :disabled="isDetail">
-                中风险:2分
+                中风险
             </el-radio>
             <el-radio v-model="form.riskLevel" label="high" :disabled="isDetail">
-                高风险:≥3分
+                高风险
             </el-radio>
           </div>
         </div>
@@ -794,17 +798,21 @@ const handleExport = () => {
       <!-- 备注 -->
       <div class="remark-section">
         <span class="remark-label">备注:</span>
-        <span>若平日戴老花镜或近视镜,应在佩戴眼镜的情况下评估。</span>
+        <div style="flex-direction: column;display: flex;justify-content: center;">
+            <span class="remark-text">1.若平日戴老花镜或近视镜,应在佩戴眼镜的情况下评估。</span>
+            <span class="remark-text">2.风险程度判断:无风险:0分;低风险:1分;中风险:2分,高风险:≥3分。</span>
+            <span class="remark-text">3.院内老人均需进行简易精神状态评价量表(MMSE),如老人存在视觉异常需增加《感知觉与沟通评估表》,两表同时使用时按分高为最终评估结果。</span>
+          </div>
       </div>
 
       <!-- 风险程度判断 -->
       <div class="risk-judgment-section">
         <div class="risk-judgment-title">风险程度判断:</div>
         <div class="risk-options">
-          <span class="risk-option">${form.riskLevel === 'none' ? '☑' : '☐'} 无风险:0分</span>
-          <span class="risk-option">${form.riskLevel === 'low' ? '☑' : '☐'} 低风险:1分</span>
-          <span class="risk-option">${form.riskLevel === 'medium' ? '☑' : '☐'} 中风险:2分</span>
-          <span class="risk-option">${form.riskLevel === 'high' ? '☑' : '☐'} 高风险:≥3分</span>
+          <span class="risk-option">${form.riskLevel === 'none' ? '☑' : '☐'} 无风险</span>
+          <span class="risk-option">${form.riskLevel === 'low' ? '☑' : '☐'} 低风险</span>
+          <span class="risk-option">${form.riskLevel === 'medium' ? '☑' : '☐'} 中风险</span>
+          <span class="risk-option">${form.riskLevel === 'high' ? '☑' : '☐'} 高风险</span>
         </div>
       </div>
 

+ 81 - 82
src/views/elderly/apply/nine-precautions/nutritional-risk/AddForm.vue

@@ -77,69 +77,65 @@
             </tr>
           </thead>
           <tbody>
-            <!-- 1. BMI -->
-            <tr>
-              <td class="col-item">1. BMI</td>
-              <td class="col-score">
-                <el-radio :label="0" v-model="form.initialScores[0]" :disabled="isDetail" @change="calculateScores">BMI&lt;19<br/>或 BMI≥28</el-radio>
-              </td>
-              <td class="col-score">
-                <el-radio :label="1" v-model="form.initialScores[0]" :disabled="isDetail" @change="calculateScores">19≤BMI&lt;21<br/>或 26≤BMI&lt;28</el-radio>
-              </td>
-              <td class="col-score">
-                <el-radio :label="2" v-model="form.initialScores[0]" :disabled="isDetail" @change="calculateScores">21≤BMI&lt;23<br/>或24≤BMI&lt;26</el-radio>
-              </td>
-              <td class="col-score">
-                <el-radio :label="3" v-model="form.initialScores[0]" :disabled="isDetail" @change="calculateScores">23≤BMI≤24</el-radio>
-              </td>
-            </tr>
-
-            <!-- 2. 近3个月体重变化 -->
-            <tr>
-              <td class="col-item">2. 近3个月体重变化</td>
-              <td class="col-score">
-                <el-radio :label="0" v-model="form.initialScores[1]" :disabled="isDetail" @change="calculateScores">减少或增加≥3Kg</el-radio>
-              </td>
-              <td class="col-score">
-                <el-radio :label="1" v-model="form.initialScores[1]" :disabled="isDetail" @change="calculateScores">不知道</el-radio>
-              </td>
-              <td class="col-score">
-                <el-radio :label="2" v-model="form.initialScores[1]" :disabled="isDetail" @change="calculateScores">1Kg≤减少&lt;3Kg<br/>或1Kg≤增加&lt;3Kg</el-radio>
-              </td>
-              <td class="col-score">
-                <el-radio :label="3" v-model="form.initialScores[1]" :disabled="isDetail" @change="calculateScores">0Kg&lt;减少&lt;1Kg<br/>或0Kg&lt;增加&lt;1Kg</el-radio>
-              </td>
-            </tr>
-
-            <!-- 3. 活动能力 -->
-            <tr>
-              <td class="col-item">3. 活动能力</td>
-              <td class="col-score">
-                <el-radio :label="0" v-model="form.initialScores[2]" :disabled="isDetail" @change="calculateScores">卧床</el-radio>
-              </td>
-              <td class="col-score">
-                <el-radio :label="1" v-model="form.initialScores[2]" :disabled="isDetail" @change="calculateScores">需要依赖工具活动</el-radio>
-              </td>
-              <td class="col-score">
-                <el-radio :label="2" v-model="form.initialScores[2]" :disabled="isDetail" @change="calculateScores">独立户外活动</el-radio>
-              </td>
-              <td class="col-score">—</td>
-            </tr>
+          <!-- 6. 近三个月有无饮食量变化 -->
+          <tr>
+            <td class="col-item">1. 近三个月有无饮食量变化</td>
+            <td class="col-score">
+              <el-radio :label="0" v-model="form.initialScores[5]" :disabled="isDetail" @change="calculateScores">严重增加或减少</el-radio>
+            </td>
+            <td class="col-score">
+              <el-radio :label="1" v-model="form.initialScores[5]" :disabled="isDetail" @change="calculateScores">增加或减少</el-radio>
+            </td>
+            <td class="col-score">
+              <el-radio :label="2" v-model="form.initialScores[5]" :disabled="isDetail" @change="calculateScores">无变化</el-radio>
+            </td>
+            <td class="col-score">—</td>
+          </tr>
 
-            <!-- 4. 牙齿状况 -->
-            <tr>
-              <td class="col-item">4. 牙齿状况</td>
-              <td class="col-score">
-                <el-radio :label="0" v-model="form.initialScores[3]" :disabled="isDetail" @change="calculateScores">全口或半口缺</el-radio>
-              </td>
-              <td class="col-score">
-                <el-radio :label="1" v-model="form.initialScores[3]" :disabled="isDetail" @change="calculateScores">用义齿</el-radio>
-              </td>
-              <td class="col-score">
-                <el-radio :label="2" v-model="form.initialScores[3]" :disabled="isDetail" @change="calculateScores">正常</el-radio>
-              </td>
-              <td class="col-score">—</td>
-            </tr>
+          <!-- 2. 近3个月体重变化 -->
+          <tr>
+            <td class="col-item">2. 近3个月体重变化</td>
+            <td class="col-score">
+              <el-radio :label="0" v-model="form.initialScores[1]" :disabled="isDetail" @change="calculateScores">减少或增加≥3Kg</el-radio>
+            </td>
+            <td class="col-score">
+              <el-radio :label="1" v-model="form.initialScores[1]" :disabled="isDetail" @change="calculateScores">不知道</el-radio>
+            </td>
+            <td class="col-score">
+              <el-radio :label="2" v-model="form.initialScores[1]" :disabled="isDetail" @change="calculateScores">1Kg≤减少&lt;3Kg<br/>或1Kg≤增加&lt;3Kg</el-radio>
+            </td>
+            <td class="col-score">
+              <el-radio :label="3" v-model="form.initialScores[1]" :disabled="isDetail" @change="calculateScores">0Kg&lt;减少&lt;1Kg<br/>或0Kg&lt;增加&lt;1Kg</el-radio>
+            </td>
+          </tr>
+          <!-- 3. 活动能力 -->
+          <tr>
+            <td class="col-item">3. 活动能力</td>
+            <td class="col-score">
+              <el-radio :label="0" v-model="form.initialScores[2]" :disabled="isDetail" @change="calculateScores">卧床</el-radio>
+            </td>
+            <td class="col-score">
+              <el-radio :label="1" v-model="form.initialScores[2]" :disabled="isDetail" @change="calculateScores">需要依赖工具活动</el-radio>
+            </td>
+            <td class="col-score">
+              <el-radio :label="2" v-model="form.initialScores[2]" :disabled="isDetail" @change="calculateScores">独立户外活动</el-radio>
+            </td>
+            <td class="col-score">—</td>
+          </tr>
+          <!-- 4. 牙齿状况 -->
+          <tr>
+            <td class="col-item">4. 牙齿状况</td>
+            <td class="col-score">
+              <el-radio :label="0" v-model="form.initialScores[3]" :disabled="isDetail" @change="calculateScores">全口或半口缺</el-radio>
+            </td>
+            <td class="col-score">
+              <el-radio :label="1" v-model="form.initialScores[3]" :disabled="isDetail" @change="calculateScores">用义齿</el-radio>
+            </td>
+            <td class="col-score">
+              <el-radio :label="2" v-model="form.initialScores[3]" :disabled="isDetail" @change="calculateScores">正常</el-radio>
+            </td>
+            <td class="col-score">—</td>
+          </tr>
 
             <!-- 5. 神经精神疾病 -->
             <tr>
@@ -155,21 +151,24 @@
               </td>
               <td class="col-score">—</td>
             </tr>
+          <!-- 1. BMI -->
+          <tr>
+            <td class="col-item">6. BMI</td>
+            <td class="col-score">
+              <el-radio :label="0" v-model="form.initialScores[0]" :disabled="isDetail" @change="calculateScores">BMI&lt;19<br/>或 BMI≥28</el-radio>
+            </td>
+            <td class="col-score">
+              <el-radio :label="1" v-model="form.initialScores[0]" :disabled="isDetail" @change="calculateScores">19≤BMI&lt;21<br/>或 26≤BMI&lt;28</el-radio>
+            </td>
+            <td class="col-score">
+              <el-radio :label="2" v-model="form.initialScores[0]" :disabled="isDetail" @change="calculateScores">21≤BMI&lt;23<br/>或24≤BMI&lt;26</el-radio>
+            </td>
+            <td class="col-score">
+              <el-radio :label="3" v-model="form.initialScores[0]" :disabled="isDetail" @change="calculateScores">23≤BMI≤24</el-radio>
+            </td>
+          </tr>
+
 
-            <!-- 6. 近三个月有无饮食量变化 -->
-            <tr>
-              <td class="col-item">6. 近三个月有无饮食量变化</td>
-              <td class="col-score">
-                <el-radio :label="0" v-model="form.initialScores[5]" :disabled="isDetail" @change="calculateScores">严重增加或减少</el-radio>
-              </td>
-              <td class="col-score">
-                <el-radio :label="1" v-model="form.initialScores[5]" :disabled="isDetail" @change="calculateScores">增加或减少</el-radio>
-              </td>
-              <td class="col-score">
-                <el-radio :label="2" v-model="form.initialScores[5]" :disabled="isDetail" @change="calculateScores">无变化</el-radio>
-              </td>
-              <td class="col-score">—</td>
-            </tr>
           </tbody>
         </table>
 
@@ -784,12 +783,12 @@ const handleExport = () => {
 
   // 初筛项目数据
   const initialItems = [
-    { name: '1. BMI', options: [{ score: 0, text: 'BMI<19 或 BMI≥28' }, { score: 1, text: '19≤BMI<21 或 26≤BMI<28' }, { score: 2, text: '21≤BMI<23 或 24≤BMI<26' }, { score: 3, text: '23≤BMI≤24' }] },
+    { name: '1. 近三个月有无饮食量变化', options: [{ score: 0, text: '严重增加或减少' }, { score: 1, text: '增加或减少' }, { score: 2, text: '无变化' }, { score: null, text: '—' }] },
     { name: '2. 近3个月体重变化', options: [{ score: 0, text: '减少或增加≥3Kg' }, { score: 1, text: '不知道' }, { score: 2, text: '1Kg≤减少<3Kg 或 1Kg≤增加<3Kg' }, { score: 3, text: '0Kg<减少<1Kg 或 0Kg<增加<1Kg' }] },
     { name: '3. 活动能力', options: [{ score: 0, text: '卧床' }, { score: 1, text: '需要依赖工具活动' }, { score: 2, text: '独立户外活动' }, { score: null, text: '—' }] },
     { name: '4. 牙齿状况', options: [{ score: 0, text: '全口或半口缺' }, { score: 1, text: '用义齿' }, { score: 2, text: '正常' }, { score: null, text: '—' }] },
     { name: '5. 神经精神疾病', options: [{ score: 0, text: '严重认知障碍或抑郁' }, { score: 1, text: '轻度认知障碍或抑郁' }, { score: 2, text: '无认知障碍或抑郁' }, { score: null, text: '—' }] },
-    { name: '6. 近三个月有无饮食量变化', options: [{ score: 0, text: '严重增加或减少' }, { score: 1, text: '增加或减少' }, { score: 2, text: '无变化' }, { score: null, text: '—' }] }
+    { name: '6. BMI', options: [{ score: 0, text: 'BMI<19 或 BMI≥28' }, { score: 1, text: '19≤BMI<21 或 26≤BMI<28' }, { score: 2, text: '21≤BMI<23 或 24≤BMI<26' }, { score: 3, text: '23≤BMI≤24' }] }
   ]
 
   // 评估项目数据
@@ -1261,15 +1260,15 @@ defineExpose({
           }
 
           .col-item {
-            width: 20%;
-            text-align: center;
+            padding-left: 30px;
+            text-align: left;
             font-weight: bold;
             vertical-align: middle;
           }
 
           .col-score {
-            width: 20%;
-            text-align: center;
+            padding-left: 30px;
+            text-align: left;
             vertical-align: middle;
 
             .el-radio {

+ 473 - 174
src/views/elderly/apply/nine-precautions/risk-disclosure-statement/Form.vue

@@ -1,10 +1,12 @@
 <template>
-  <Dialog
+  <el-drawer
     v-model="dialogVisible"
     :title="dialogTitle"
-    width="80%"
+    size="70%"
     class="risk-disclosure-statement-form"
-    scroll
+    :close-on-click-modal="false"
+    :close-on-press-escape="false"
+    :destroy-on-close="true"
     @close="handleClosed"
   >
     <el-form
@@ -38,9 +40,8 @@
       </el-row>
 
       <!-- 长者详情展示 - 对应图片中的表一表头信息 -->
-      <div v-if="elderDetail.id" class="elder-detail-wrap">
-        <el-descriptions :column="4" border size="small">
-          <el-descriptions-item label="区/楼层">{{ elderDetail.floorName || '-' }}</el-descriptions-item>
+      <div  class="elder-detail-wrap">
+        <el-descriptions :column="2" border size="small">
           <el-descriptions-item label="姓名">{{ elderDetail.elderName || '-' }}</el-descriptions-item>
           <el-descriptions-item label="性别">{{ getDictLabel(DICT_TYPE.SYSTEM_USER_SEX, elderDetail.elderSex) || '-' }}</el-descriptions-item>
           <el-descriptions-item label="年龄">{{ elderDetail.elderAge || '-' }}岁</el-descriptions-item>
@@ -59,141 +60,92 @@
           经我院评估您或您相关第三方的身体状况,您或您亲属在我院养老期间,存在下列服务安全风险。为保证对您或您相关第三方的服务质量,特向您告知!我院将针对老年人的情况做好相关防范措施,请您理解、配合、并支持相关工作措施的落实。
         </p>
 
-        <!-- 风险项目列表 -->
-        <div class="risk-list">
-          <div v-for="(item, index) in riskItems" :key="index" class="risk-item">
-            <el-checkbox v-model="item.checked" :label="item.name" />
-            <span class="risk-label">风险程度:</span>
-            <el-radio-group v-model="item.riskLevel" size="small">
-              <el-radio value="low">低危</el-radio>
-              <el-radio value="medium">中危</el-radio>
-              <el-radio value="high">高危</el-radio>
-            </el-radio-group>
-          </div>
+        <!-- 风险项目表格 -->
+        <div class="risk-table-wrapper">
+          <table class="risk-table">
+            <thead>
+              <tr>
+                <th class="col-index">序号</th>
+                <th class="col-project">项目</th>
+                <th class="col-level">风险程度</th>
+                <th class="col-remark">备注</th>
+              </tr>
+            </thead>
+            <tbody>
+              <tr v-for="(item, index) in riskTableItems" :key="index">
+                <td class="col-index">{{ index + 1 }}</td>
+                <td class="col-project">{{ item.name }}</td>
+                <td class="col-level">
+                  <el-select 
+                    v-model="item.riskLevel" 
+                    placeholder="请选择" 
+                    style="width: 120px"
+                    :disabled="isView"
+                  >
+                    <el-option 
+                      v-for="option in getRiskOptions(item.key)" 
+                      :key="option.value" 
+                      :label="option.label" 
+                      :value="option.value" 
+                    />
+                  </el-select>
+                </td>
+                <td class="col-remark">
+                  <span class="remark-text">风险程度:</span>
+                  <el-checkbox v-model="item.lowChecked" :disabled="isView" size="small">低危</el-checkbox>
+                  <el-checkbox v-model="item.mediumChecked" :disabled="isView" size="small">中危</el-checkbox>
+                  <el-checkbox v-model="item.highChecked" :disabled="isView" size="small">高危</el-checkbox>
+                </td>
+              </tr>
+            </tbody>
+          </table>
         </div>
 
-        <!-- 其他风险 -->
-        <el-form-item label="其它服务风险:" class="other-risk">
-          <TgTextarea v-model="dataForm.otherRisk" placeholder="请输入其他服务风险" :rows="2" />
-        </el-form-item>
-      </div>
+        <!-- 预计下次评估日期 -->
+        <div class="next-assess-date">
+          <span class="date-label">预计下次评估日期:</span>
+          <el-date-picker
+            v-model="dataForm.nextAssessDate"
+            type="date"
+            placeholder="选择日期"
+            style="width: 150px"
+            :disabled="isView"
+          />
+          <span class="date-value">{{ dataForm.nextAssessDate ? formatDate(dataForm.nextAssessDate) : '无' }}</span>
+        </div>
 
-      <!-- 签名区域 -->
-      <div class="section-title">签字确认</div>
-      <el-row :gutter="20">
-        <el-col :span="24">
-          <el-form-item label="首次告知签名:" label-width="170">
-            <div style="display: flex;flex-direction: row">
-              <div style="display: flex;align-items: center;width: 560px">
-                通过对老年人的整体评估,老年人有可能发生:
-                <TgInput v-model="dataForm.firstRisk" placeholder="输入风险" style="width: 250px;margin-left: 10px"/>
-              </div>
-              其风险及防范措施已向老年人或相关第三方进行了如实告知。
-            </div>
-          </el-form-item>
-        </el-col>
-        <el-col :span="24">
-          <el-form-item label="护理人员签名" label-width="170">
-            <TgInput v-model="dataForm.firstNurseSign" placeholder="签字人" />
-          </el-form-item>
-        </el-col>
-      </el-row>
-      <el-row :gutter="20">
-        <el-col :span="12">
-          <el-form-item label="老年人/相关第三方签字" label-width="170">
-            <TgInput v-model="dataForm.firstElderSign" placeholder="签字人" />
-          </el-form-item>
-        </el-col>
-        <el-col :span="12">
-          <el-form-item label="签字日期">
-            <TgDatePicker v-model="dataForm.firstSignDate" type="date" placeholder="选择日期" />
-          </el-form-item>
-        </el-col>
-      </el-row>
+        <!-- 告知签名区域 -->
+        <div class="signature-section">
+          <div class="signature-title">告知签名:</div>
+          <p class="signature-desc">
+            通过对老年人的整体评估,老年人有可能发生以上风险,其风险及防范措施已向老年人或相关第三方进行了如实告知。
+          </p>
+          <p class="signature-declare">
+            (老年人或相关第三方声明:本人已知悉并签字确认。)
+          </p>
+          
+          <div class="signature-item">
+            <span class="signature-label">经办人(护理人员):</span>
 
-      <!-- 第二次告知签名 -->
-      <el-divider />
-      <el-row :gutter="20">
-        <el-col :span="24">
-          <el-form-item label="第二次告知签名:" label-width="170">
-            <div style="display: flex;flex-direction: row">
-              <div style="display: flex;align-items: center;width: 700px">
-                通过对老年人的整体评估,随着病情的发展变化,老年人有可能发生:
-                <TgInput v-model="dataForm.secondRisk" placeholder="输入风险" style="width: 250px;margin-left: 10px"/>
-              </div>
-              其风险及防范措施已向老年人或相关第三方进行了如实告知。
-            </div>
-          </el-form-item>
-        </el-col>
-        <el-col :span="24">
-          <el-form-item label="护理人员" label-width="170">
-            <TgInput v-model="dataForm.secondNurseSign" placeholder="签字人" />
-          </el-form-item>
-        </el-col>
-      </el-row>
-      <el-row :gutter="20">
-        <el-col :span="12">
-          <el-form-item label="变动风险" label-width="170">
-            <TgInput v-model="dataForm.secondChangeRisk" placeholder="变动风险描述" />
-          </el-form-item>
-        </el-col>
-        <el-col :span="12">
-          <el-form-item label="风险程度">
-            <el-radio-group v-model="dataForm.secondRiskLevel" size="small">
-              <el-radio value="low">低危</el-radio>
-              <el-radio value="medium">中危</el-radio>
-              <el-radio value="high">高危</el-radio>
-            </el-radio-group>
-          </el-form-item>
-        </el-col>
-      </el-row>
-      <el-row :gutter="20">
-        <el-col :span="12">
-          <el-form-item label="老年人/相关第三方签字" label-width="170">
-            <TgInput v-model="dataForm.secondElderSign" placeholder="签字人" />
-          </el-form-item>
-        </el-col>
-        <el-col :span="12">
-          <el-form-item label="签字日期">
-            <TgDatePicker v-model="dataForm.secondSignDate" type="date" placeholder="选择日期" />
-          </el-form-item>
-        </el-col>
-      </el-row>
+          </div>
+          
+          <div class="signature-item">
+            <span class="signature-label">老年人或相关第三方签名:</span>
 
-      <!-- 其他备注 -->
-      <el-divider />
-      <el-form-item label="其他">
-        <TgTextarea v-model="dataForm.remark" placeholder="请输入其他备注信息" :rows="3" />
-      </el-form-item>
+          </div>
+        </div>
+      </div>
 
-      <!-- 底部签名 -->
-      <el-row :gutter="20">
-        <el-col :span="12">
-          <el-form-item label="护理人员">
-            <TgInput v-model="dataForm.nurseSign" placeholder="护理人员签字" />
-          </el-form-item>
-        </el-col>
-        <el-col :span="12">
-          <el-form-item label="老年人/相关第三方签字" label-width="170">
-            <TgInput v-model="dataForm.elderSign" placeholder="签字人" />
-          </el-form-item>
-        </el-col>
-      </el-row>
-      <el-row :gutter="20">
-        <el-col :span="12" :offset="12">
-          <el-form-item label="签字日期" label-width="170">
-            <TgDatePicker v-model="dataForm.signDate" type="date" placeholder="选择日期" />
-          </el-form-item>
-        </el-col>
-      </el-row>
+ 
     </el-form>
 
     <template #footer>
       <el-button v-if="!isView" @click="handleClosed">取消</el-button>
       <el-button v-if="!isView" type="primary" @click="submitForm" :loading="submitLoading">确定</el-button>
       <el-button v-if="isView" @click="handleClosed">关闭</el-button>
+      <el-button v-if="isView" type="success" @click="handleExport">打印</el-button>
     </template>
-  </Dialog>
+  </el-drawer>
 </template>
 
 <script setup lang="ts">
@@ -223,18 +175,71 @@ const selectElderRef = ref()
 // 长者详情
 const elderDetail = ref<any>({})
 
-// 风险项目
-const riskItems = ref([
-  { name: '噎食', checked: false, riskLevel: '' },
-  { name: '食品药品误食', checked: false, riskLevel: '' },
-  { name: '压疮', checked: false, riskLevel: '' },
-  { name: '烫伤', checked: false, riskLevel: '' },
-  { name: '坠床', checked: false, riskLevel: '' },
-  { name: '跌倒', checked: false, riskLevel: '' },
-  { name: '他伤或自伤', checked: false, riskLevel: '' },
-  { name: '走失', checked: false, riskLevel: '' }
+// 风险项目表格数据
+const riskTableItems = ref([
+  { key: 'asphyxiation', name: '防噎食评估:', riskLevel: '', lowChecked: false, mediumChecked: false, highChecked: false },
+  { key: 'pressureUlcer', name: '防压疮评估', riskLevel: '', lowChecked: false, mediumChecked: false, highChecked: false },
+  { key: 'fall', name: '防跌倒风险评估:', riskLevel: '', lowChecked: false, mediumChecked: false, highChecked: false },
+  { key: 'bedFall', name: '防坠床评估:', riskLevel: '', lowChecked: false, mediumChecked: false, highChecked: false },
+  { key: 'scald', name: '防烫伤评估:', riskLevel: '', lowChecked: false, mediumChecked: false, highChecked: false },
+  { key: 'wandering', name: '防走失风险评估:', riskLevel: '', lowChecked: false, mediumChecked: false, highChecked: false },
+  { key: 'selfHarm', name: '防自伤或他伤:', riskLevel: '', lowChecked: false, mediumChecked: false, highChecked: false },
+  { key: 'foodDrug', name: '防食品药品误食评估:', riskLevel: '', lowChecked: false, mediumChecked: false, highChecked: false },
+  { key: 'entertainment', name: '防文娱活动意外:', riskLevel: '', lowChecked: false, mediumChecked: false, highChecked: false }
 ])
 
+// 接口返回的风险数据选项(模拟数据,实际从接口获取)
+const riskOptionsMap = ref<Record<string, any[]>>({
+  asphyxiation: [],
+  pressureUlcer: [],
+  fall: [],
+  bedFall: [],
+  scald: [],
+  wandering: [],
+  selfHarm: [],
+  foodDrug: [],
+  entertainment: []
+})
+
+// 获取风险选项(从接口数据)
+const getRiskOptions = (key: string) => {
+  // 如果接口返回了数据,使用接口数据
+  const options = riskOptionsMap.value[key]
+  if (options && options.length > 0) {
+    return options
+  }
+  // 默认选项
+  return [
+    { label: '无风险', value: 'none' },
+    { label: '低风险', value: 'low' },
+    { label: '中风险', value: 'medium' },
+    { label: '高风险', value: 'high' }
+  ]
+}
+
+// 加载长者风险数据(从接口获取)
+const loadElderRiskData = async (elderId: string) => {
+  try {
+    // TODO: 调用接口获取长者的各项评估数据
+    // const res = await getElderRiskAssessments(elderId)
+    // 模拟接口返回数据
+    const mockData = {
+      asphyxiation: [{ label: '√低风险', value: 'low' }, { label: '√中风险', value: 'medium' }],
+      pressureUlcer: [{ label: '√低风险', value: 'low' }],
+      fall: [{ label: '√低风险', value: 'low' }],
+      bedFall: [{ label: '√高风险', value: 'high' }],
+      scald: [{ label: '√低风险', value: 'low' }],
+      wandering: [{ label: '√低风险', value: 'low' }],
+      selfHarm: [{ label: '√低风险', value: 'low' }],
+      foodDrug: [{ label: '√低风险', value: 'low' }],
+      entertainment: [{ label: '√低风险', value: 'low' }]
+    }
+    riskOptionsMap.value = mockData
+  } catch (e) {
+    console.error('获取风险数据失败', e)
+  }
+}
+
 // 表单数据
 const dataForm = reactive({
   id: undefined,
@@ -244,6 +249,8 @@ const dataForm = reactive({
   // 风险项目数据 (JSON格式存储到 riskData)
   riskData: '',
   otherRisk: '',
+  // 预计下次评估日期
+  nextAssessDate: '',
   // 首次告知签名
   firstRisk: '',
   firstNurseSign: '',
@@ -277,6 +284,8 @@ const handleSelectElder = async (item: any) => {
     try {
       const res = await getElderInfoById(item.id)
       elderDetail.value = res
+      // 加载长者的风险评估数据
+      await loadElderRiskData(item.id)
     } catch (e) {
       console.error('获取长者详情失败', e)
     }
@@ -302,13 +311,20 @@ const open = async (row?: any, viewMode = false) => {
       // 解析风险项目
       if (res.riskData) {
         const parsedData = JSON.parse(res.riskData)
-        // 解析风险项目列表
-        if (parsedData.risks && Array.isArray(parsedData.risks)) {
-          riskItems.value = riskItems.value.map(item => {
-            const saved = parsedData.risks.find((s: any) => s.name === item.name)
-            return saved || item
-          })
-        }
+        // 解析风险表格数据
+        riskTableItems.value = riskTableItems.value.map(item => {
+          const saved = parsedData[item.key]
+          if (saved) {
+            return {
+              ...item,
+              riskLevel: saved.level || saved.id || '',
+              lowChecked: saved.remark?.low || false,
+              mediumChecked: saved.remark?.medium || false,
+              highChecked: saved.remark?.high || false
+            }
+          }
+          return item
+        })
         // 解析其他风险
         if (parsedData.otherRisk !== undefined) {
           dataForm.otherRisk = parsedData.otherRisk
@@ -329,6 +345,13 @@ const open = async (row?: any, viewMode = false) => {
   }
 }
 
+// 日期格式化
+const formatDate = (date: any) => {
+  if (!date) return ''
+  const d = new Date(date)
+  return `${d.getFullYear()}年${d.getMonth() + 1}月${d.getDate()}日`
+}
+
 // 重置表单
 const resetForm = () => {
   Object.assign(dataForm, {
@@ -338,6 +361,7 @@ const resetForm = () => {
     tenantId: getTenantId(),
     riskData: '',
     otherRisk: '',
+    nextAssessDate: '',
     firstRisk: '',
     firstNurseSign: '',
     firstElderSign: '',
@@ -354,16 +378,28 @@ const resetForm = () => {
     signDate: ''
   })
   elderDetail.value = {}
-  riskItems.value = [
-    { name: '噎食', checked: false, riskLevel: '' },
-    { name: '食品药品误食', checked: false, riskLevel: '' },
-    { name: '压疮', checked: false, riskLevel: '' },
-    { name: '烫伤', checked: false, riskLevel: '' },
-    { name: '坠床', checked: false, riskLevel: '' },
-    { name: '跌倒', checked: false, riskLevel: '' },
-    { name: '他伤或自伤', checked: false, riskLevel: '' },
-    { name: '走失', checked: false, riskLevel: '' }
+  riskTableItems.value = [
+    { key: 'asphyxiation', name: '防噎食评估:', riskLevel: '', lowChecked: false, mediumChecked: false, highChecked: false },
+    { key: 'pressureUlcer', name: '防压疮评估', riskLevel: '', lowChecked: false, mediumChecked: false, highChecked: false },
+    { key: 'fall', name: '防跌倒风险评估:', riskLevel: '', lowChecked: false, mediumChecked: false, highChecked: false },
+    { key: 'bedFall', name: '防坠床评估:', riskLevel: '', lowChecked: false, mediumChecked: false, highChecked: false },
+    { key: 'scald', name: '防烫伤评估:', riskLevel: '', lowChecked: false, mediumChecked: false, highChecked: false },
+    { key: 'wandering', name: '防走失风险评估:', riskLevel: '', lowChecked: false, mediumChecked: false, highChecked: false },
+    { key: 'selfHarm', name: '防自伤或他伤:', riskLevel: '', lowChecked: false, mediumChecked: false, highChecked: false },
+    { key: 'foodDrug', name: '防食品药品误食评估:', riskLevel: '', lowChecked: false, mediumChecked: false, highChecked: false },
+    { key: 'entertainment', name: '防文娱活动意外', riskLevel: '', lowChecked: false, mediumChecked: false, highChecked: false }
   ]
+  riskOptionsMap.value = {
+    asphyxiation: [],
+    pressureUlcer: [],
+    fall: [],
+    bedFall: [],
+    scald: [],
+    wandering: [],
+    selfHarm: [],
+    foodDrug: [],
+    entertainment: []
+  }
 }
 
 // 关闭弹窗
@@ -380,12 +416,21 @@ const submitForm = async () => {
 
   submitLoading.value = true
   try {
-    // 处理风险项目数据 - 包含风险项目列表和其他风险
-    const selectedRisks = riskItems.value.filter(item => item.checked)
-    const riskDataObj = {
-      risks: selectedRisks,
-      otherRisk: dataForm.otherRisk
-    }
+    // 处理风险项目数据 - 将表格数据转换为存储格式
+    const riskDataObj: Record<string, any> = {}
+    riskTableItems.value.forEach(item => {
+      riskDataObj[item.key] = {
+        id: item.riskLevel, // 风险程度ID
+        level: item.riskLevel, // 风险等级
+        // 备注信息
+        remark: {
+          low: item.lowChecked,
+          medium: item.mediumChecked,
+          high: item.highChecked
+        }
+      }
+    })
+    
     const submitData = {
       ...dataForm,
       riskData: JSON.stringify(riskDataObj)
@@ -406,6 +451,160 @@ const submitForm = async () => {
   }
 }
 
+// 打印功能
+const handleExport = () => {
+  // 创建打印窗口
+  const printWindow = window.open('', '_blank')
+  if (!printWindow) {
+    message.error('请允许弹出窗口以进行打印')
+    return
+  }
+
+  // 获取长者信息
+  const elderName = elderDetail.value.elderName || ''
+  const elderSex = getDictLabel(DICT_TYPE.SYSTEM_USER_SEX, elderDetail.value.elderSex) || ''
+  const elderAge = elderDetail.value.elderAge || ''
+  const bedName = elderDetail.value.bedName || ''
+  const nurseLevelName = elderDetail.value.nurseLevelName || ''
+
+  // 构建风险表格HTML
+  let riskTableHtml = ''
+  riskTableItems.value.forEach((item, index) => {
+    const riskLevelText = getRiskLevelText(item.riskLevel)
+    const lowChecked = item.lowChecked ? '☑' : '☐'
+    const mediumChecked = item.mediumChecked ? '☑' : '☐'
+    const highChecked = item.highChecked ? '☑' : '☐'
+    
+    riskTableHtml += `
+      <tr>
+        <td style="border: 1px solid #333; padding: 8px; text-align: center;">${index + 1}</td>
+        <td style="border: 1px solid #333; padding: 8px;">${item.name}</td>
+        <td style="border: 1px solid #333; padding: 8px; text-align: center;">${riskLevelText}</td>
+        <td style="border: 1px solid #333; padding: 8px;">
+          <span>风险程度:</span>
+          <span>${lowChecked}低危</span>
+          <span style="margin-left: 10px;">${mediumChecked}中危</span>
+          <span style="margin-left: 10px;">${highChecked}高危</span>
+        </td>
+      </tr>
+    `
+  })
+
+  // 预计下次评估日期
+  const nextAssessDate = dataForm.nextAssessDate ? formatDate(dataForm.nextAssessDate) : '无'
+
+  // 构建打印内容
+  const printContent = `
+    <!DOCTYPE html>
+    <html>
+    <head>
+      <meta charset="UTF-8">
+      <title>服务安全风险知情告知书</title>
+      <style>
+        body { font-family: 'SimSun', serif; font-size: 14px; line-height: 1.6; }
+        .print-container { width: 210mm; margin: 0 auto; padding: 20mm; }
+        .title { text-align: center; font-size: 22px; font-weight: bold; margin-bottom: 20px; }
+        .subtitle { text-align: center; font-size: 16px; margin-bottom: 30px; }
+        .info-row { display: flex; margin-bottom: 10px; }
+        .info-item { flex: 3; }
+        .section-title { font-weight: bold; margin: 20px 0 10px; }
+        .content-text { text-indent: 2em; margin-bottom: 10px; }
+        table { width: 100%; border-collapse: collapse; margin: 15px 0; }
+        th { background-color: #f5f5f5; font-weight: bold; }
+        .signature-section { margin-top: 30px; }
+        .signature-title { font-weight: bold; margin-bottom: 10px; }
+        .signature-item { margin: 15px 0; }
+        .signature-line { display: inline-block; width: 200px; border-bottom: 1px solid #333; margin-left: 10px; }
+        .next-date { margin: 15px 0; padding: 10px; background-color: #f5f5f5; }
+        @media print { body { margin: 0; } .print-container { padding: 10mm; } }
+      </style>
+    </head>
+    <body>
+      <div class="print-container">
+        <div class="title">服务安全风险知情告知书</div>
+        
+        <div class="info-row">
+          <div class="info-item">姓名:${elderName}</div>
+          <div class="info-item" style="flex: 2">性别:${elderSex}</div>
+          <div class="info-item" style="flex: 2">年龄:${elderAge}岁</div>
+          <div class="info-item">床号:${bedName}</div>
+          <div class="info-item">护理级别:${nurseLevelName}</div>
+        </div>
+
+        <div class="section-title">尊敬的老年人/相关第三方/监护人:</div>
+        <div class="content-text">您好!感谢您对本机构的信任和支持。</div>
+        <div class="content-text">
+          经我院评估您或您相关第三方的身体状况,您或您亲属在我院养老期间,存在下列服务安全风险。
+          为保证对您或您相关第三方的服务质量,特向您告知!我院将针对老年人的情况做好相关防范措施,
+          请您理解、配合、并支持相关工作措施的落实。
+        </div>
+
+        <table>
+          <thead>
+            <tr>
+              <th style="border: 1px solid #333; padding: 8px; width: 60px;">序号</th>
+              <th style="border: 1px solid #333; padding: 8px;">项目</th>
+              <th style="border: 1px solid #333; padding: 8px; width: 100px;">风险程度</th>
+              <th style="border: 1px solid #333; padding: 8px;">备注</th>
+            </tr>
+          </thead>
+          <tbody>
+            ${riskTableHtml}
+          </tbody>
+        </table>
+
+        <div class="next-date">
+          <strong>预计下次评估日期:</strong>${nextAssessDate}
+        </div>
+
+        <div class="signature-section">
+          <div class="signature-title">告知签名:</div>
+          <div class="content-text">
+            通过对老年人的整体评估,老年人有可能发生以上风险,其风险及防范措施已向老年人或相关第三方进行了如实告知。
+          </div>
+          <div style="color: #666; font-size: 12px; margin-bottom: 20px;">
+            (老年人或相关第三方声明:本人已知悉并签字确认。)
+          </div>
+          
+          <div class="signature-item">
+            <span>经办人(护理人员):</span>
+          
+          </div>
+          
+          <div class="signature-item">
+            <span>老年人或相关第三方签名:</span>
+           
+          </div>
+        </div>
+
+        ${dataForm.remark ? `<div class="section-title">其他备注:</div><div>${dataForm.remark}</div>` : ''}
+      </div>
+      <script>
+        window.onload = function() {
+          setTimeout(function() {
+            window.print();
+          }, 500);
+        };
+      <\/script>
+    </body>
+    </html>
+  `
+
+  printWindow.document.write(printContent)
+  printWindow.document.close()
+}
+
+// 获取风险等级文本
+const getRiskLevelText = (level: string): string => {
+  const levelMap: Record<string, string> = {
+    'none': '无风险',
+    'low': '低风险',
+    'medium': '中风险',
+    'high': '高风险'
+  }
+  return levelMap[level] || level || '-'
+}
+
 defineExpose({ open })
 </script>
 
@@ -444,25 +643,125 @@ defineExpose({ open })
   }
 }
 
-.risk-list {
-  margin: 15px 0;
+// 风险表格样式
+.risk-table-wrapper {
+  margin: 20px 0;
+  overflow-x: auto;
+
+  .risk-table {
+    width: 100%;
+    border-collapse: collapse;
+    font-size: 14px;
 
-  .risk-item {
+    th, td {
+      border: 1px solid #dcdfe6;
+      padding: 10px 8px;
+      text-align: center;
+    }
+
+    th {
+      background-color: #f5f7fa;
+      font-weight: bold;
+    }
+
+    .col-index {
+      width: 60px;
+    }
+
+    .col-project {
+      width: 180px;
+      text-align: left;
+      padding-left: 15px;
+    }
+
+    .col-level {
+      width: 140px;
+    }
+
+    .col-remark {
+      width: auto;
+      text-align: left;
+      padding-left: 15px;
+
+      .remark-text {
+        margin-right: 10px;
+        color: #606266;
+      }
+
+      :deep(.el-checkbox) {
+        margin-right: 15px;
+      }
+    }
+  }
+}
+
+// 预计下次评估日期
+.next-assess-date {
+  display: flex;
+  align-items: center;
+  margin: 20px 0;
+  padding: 15px;
+  background-color: #f5f7fa;
+  border-radius: 4px;
+
+  .date-label {
+    font-weight: bold;
+    margin-right: 15px;
+    color: #333;
+  }
+
+  .date-value {
+    margin-left: 15px;
+    color: #606266;
+  }
+}
+
+// 签名区域
+.signature-section {
+  margin-top: 30px;
+  padding: 20px;
+  background-color: #fafafa;
+  border-radius: 4px;
+  border: 1px solid #ebeef5;
+
+  .signature-title {
+    font-size: 16px;
+    font-weight: bold;
+    margin-bottom: 15px;
+    color: #333;
+  }
+
+  .signature-desc {
+    text-indent: 2em;
+    line-height: 1.8;
+    margin-bottom: 10px;
+    color: #606266;
+  }
+
+  .signature-declare {
+    text-indent: 2em;
+    margin-bottom: 25px;
+    color: #909399;
+    font-size: 13px;
+  }
+
+  .signature-item {
     display: flex;
     align-items: center;
-    margin-bottom: 10px;
-    padding: 8px;
-    background-color: #fff;
-    border-radius: 4px;
-
-    .risk-label {
-      margin-left: 20px;
-      margin-right: 10px;
-      color: #666;
+    margin-bottom: 20px;
+
+    .signature-label {
+      font-weight: bold;
+      white-space: nowrap;
+      color: #333;
     }
 
-    :deep(.el-checkbox) {
-      min-width: 120px;
+    .signature-line {
+      flex: 1;
+      height: 1px;
+      border-bottom: 1px solid #333;
+      margin-left: 10px;
+      min-width: 200px;
     }
   }
 }

+ 285 - 94
src/views/elderly/apply/nine-precautions/risk-disclosure-statement/index.vue

@@ -1,3 +1,201 @@
+<template>
+  <ContentWrap>
+    <!-- 搜索工作栏 -->
+    <el-form
+      class="-mb-15px"
+      :model="queryParams"
+      ref="queryFormRef"
+      :inline="true"
+      label-width="80px"
+    >
+      <el-form-item label="长者姓名" prop="elderName">
+        <el-input
+          v-model="queryParams.elderName"
+          placeholder="请输入长者姓名"
+          class="!w-240px"
+          @keyup.enter="handleQuery"
+        />
+      </el-form-item>
+
+<!--      <el-form-item label="评估年份">-->
+<!--        <el-date-picker-->
+<!--          size="default"-->
+<!--          ref="selectRef"-->
+<!--          class="!w-240px"-->
+<!--          v-model="queryParams.recordMonthRange"-->
+<!--          type="year"-->
+<!--          :clearable="true"-->
+<!--          :editable="false"-->
+<!--          placeholder="选择记录年份"-->
+<!--          value-format="YYYY"-->
+<!--          format="YYYY"-->
+<!--          date-format="YYYY"-->
+<!--        />-->
+<!--      </el-form-item>-->
+
+      <el-form-item>
+        <el-button @click="handleQuery">
+          <Icon icon="ep:search" class="mr-5px" /> 搜索
+        </el-button>
+        <el-button @click="resetQuery">
+          <Icon icon="ep:refresh" class="mr-5px" /> 重置
+        </el-button>
+      </el-form-item>
+    </el-form>
+  </ContentWrap>
+
+  <!-- 列表 -->
+  <ContentWrap>
+    <TabBarBtn>
+      <template #next>
+        <el-button type="primary" @click="handleAdd">
+          <Icon icon="ep:plus" class="mr-5px" /> 新增
+        </el-button>
+         <el-button type="success" @click="handleExport">
+          <Icon icon="ep:upload" class="mr-5px" /> 导出
+        </el-button>
+      </template>
+    </TabBarBtn>
+
+    <el-table v-loading="loading" :data="list" stripe>
+      <el-table-column type="index" label="序号" width="60" align="center" />
+      <el-table-column label="长者姓名" prop="elderName" width="110" align="center"/>
+      <el-table-column label="性别" prop="elderSex" width="80" align="center">
+        <template #default="{ row }">
+          {{ getDictLabel(DICT_TYPE.SYSTEM_USER_SEX, row.elderSex) }}
+        </template>
+      </el-table-column>
+      <el-table-column label="年龄" prop="elderAge" width="80" align="center"/>
+
+      <el-table-column label="床号" prop="bedName" width="140" align="center"/>
+      <el-table-column label="合同号" prop="bedName" width="120" align="center"/>
+      <el-table-column label="护理级别" prop="bedName" width="120" align="center"/>
+      <el-table-column label="评估日期" prop="bedName" width="120" align="center"/>
+      <el-table-column label="防噎食评估" prop="asphyxiationRisk" width="130" align="center" >
+        <template #default="{ row }">
+          <el-tag :type="getRiskType(row.asphyxiationRisk)" @click="handleOpenAsphyxiation(row)">{{ row.asphyxiationRisk || '-' }}</el-tag>
+        </template>
+      </el-table-column>
+      <el-table-column label="防压疮评估" prop="pressureUlcerRisk" width="130" align="center" >
+        <template #default="{ row }">
+          <el-tag :type="getRiskType(row.pressureUlcerRisk)" @click="handleOpenPressureUlcer(row)">{{ row.pressureUlcerRisk || '-' }}</el-tag>
+        </template>
+      </el-table-column>
+      <el-table-column label="防跌倒评估" prop="fallRisk" width="130" align="center" >
+        <template #default="{ row }">
+          <el-tag :type="getRiskType(row.fallRisk)" @click="handleOpenFall(row)">{{ row.fallRisk || '-' }}</el-tag>
+        </template>
+      </el-table-column>
+      <el-table-column label="防坠床评估" prop="bedFallRisk" width="130" align="center" >
+        <template #default="{ row }">
+          <el-tag :type="getRiskType(row.bedFallRisk)" @click="handleOpenBedFall(row)">{{ row.bedFallRisk || '-' }}</el-tag>
+        </template>
+      </el-table-column>
+      <el-table-column label="防烫伤评估" prop="scaldRisk" width="130" align="center" >
+        <template #default="{ row }">
+          <el-tag :type="getRiskType(row.scaldRisk)" @click="handleOpenScald(row)">{{ row.scaldRisk || '-' }}</el-tag>
+        </template>
+      </el-table-column>
+      <el-table-column label="防走失评估" prop="wanderingRisk" width="130" align="center" >
+        <template #default="{ row }">
+          <el-tag :type="getRiskType(row.wanderingRisk)" @click="handleOpenWandering(row)">{{ row.wanderingRisk || '-' }}</el-tag>
+        </template>
+      </el-table-column>
+      <el-table-column label="防自杀评估" prop="suicideRisk" width="130" align="center" >
+        <template #default="{ row }">
+          <el-tag :type="getRiskType(row.suicideRisk)" @click="handleOpenSuicide(row)">{{ row.suicideRisk || '-' }}</el-tag>
+        </template>
+      </el-table-column>
+
+      <el-table-column label="简易精神状态" prop="mentalState" width="130" align="center" >
+        <template #default="{ row }">
+          <el-tag :type="getRiskType(row.mentalState)" @click="handleOpenMental(row)">{{ row.mentalState || '-' }}</el-tag>
+        </template>
+      </el-table-column>
+      <el-table-column label="攻击风险评估" prop="attackRisk" width="130" align="center" >
+        <template #default="{ row }">
+          <el-tag :type="getRiskType(row.attackRisk)" @click="handleOpenAttack(row)">{{ row.attackRisk || '-' }}</el-tag>
+        </template>
+      </el-table-column>
+      <el-table-column label="感知觉与沟通评估" prop="perceptionRisk" width="142" align="center" >
+        <template #default="{ row }">
+          <el-tag :type="getRiskType(row.perceptionRisk)" @click="handleOpenPerception(row)">{{ row.perceptionRisk || '-' }}</el-tag>
+        </template>
+      </el-table-column>
+      <el-table-column label="平衡能力评估" prop="balanceRisk" width="130" align="center" >
+        <template #default="{ row }">
+          <el-tag :type="getRiskType(row.balanceRisk)" @click="handleOpenBalance(row)">{{ row.balanceRisk || '-' }}</el-tag>
+        </template>
+      </el-table-column>
+      <el-table-column label="日常生活能力评估" prop="dailyLivingRisk" width="142" align="center" >
+        <template #default="{ row }">
+          <el-tag :type="getRiskType(row.dailyLivingRisk)" @click="handleOpenDailyLiving(row)">{{ row.dailyLivingRisk || '-' }}</el-tag>
+        </template>
+      </el-table-column>
+      <el-table-column label="营养评估" prop="nutritionRisk" width="130" align="center" >
+        <template #default="{ row }">
+          <el-tag :type="getRiskType(row.nutritionRisk)" @click="handleOpenNutrition(row)">{{ row.nutritionRisk || '-' }}</el-tag>
+        </template>
+      </el-table-column>
+
+     <el-table-column label="操作" align="center" width="200" fixed="right">
+        <template #default="scope">
+          <el-button
+            link
+            type="primary"
+            @click="handleEdit(scope.row, scope.row.id)"
+          >
+            编辑
+          </el-button>
+          <el-button
+            link
+            type="warning"
+            @click="handleView(scope.row,scope.row.id)"
+          >
+            详情
+          </el-button>
+          <el-button
+            link
+            type="danger"
+            @click="handleDelete(scope.row)"
+          >
+            删除
+          </el-button>
+        </template>
+      </el-table-column>
+
+    </el-table>
+
+    <!-- 分页 -->
+    <Pagination
+      :total="total"
+      v-model:page="queryParams.pageNo"
+      v-model:limit="queryParams.pageSize"
+      @pagination="getList"
+    />
+  </ContentWrap>
+
+  <!-- 新增/编辑弹窗 -->
+  <SafetyRiskNoticeForm ref="formRef" @success="getList" />
+  
+  <!-- 各项评估详情弹窗 -->
+  <AsphyxiationForm ref="asphyxiationFormRef" />
+  <PressureSoresForm ref="pressureSoresFormRef" />
+  <FallDownForm ref="fallDownFormRef" />
+  <FallPreventionForm ref="fallPreventionFormRef" />
+  <EmpyrosisForm ref="empyrosisFormRef" />
+  <WanderAwayForm ref="wanderAwayFormRef" />
+  <CommitSuicideForm ref="commitSuicideFormRef" />
+  <MMSEForm ref="mmseFormRef" />
+  <AttackForm ref="attackFormRef" />
+  <CommunicationForm ref="communicationFormRef" />
+  <EquilibriumForm ref="equilibriumFormRef" />
+  <DailyLifeForm ref="dailyLifeFormRef" />
+  <NutritionalRiskForm ref="nutritionalRiskFormRef" />
+
+
+</template>
+
 <script setup lang="ts">
 import { DICT_TYPE, getDictLabel } from '@/utils/dict'
 import {
@@ -6,6 +204,19 @@ import {
 } from '@/api/elderly/apply/check-in'
 import { formatTime } from '@/utils'
 import SafetyRiskNoticeForm from './Form.vue'
+import AsphyxiationForm from '@/views/elderly/apply/nine-precautions/asphyxiation-by-choking/AddForm.vue'
+import PressureSoresForm from '@/views/elderly/apply/nine-precautions/pressure-sores/AddForm.vue'
+import FallDownForm from '@/views/elderly/apply/nine-precautions/fall-down/AddForm.vue'
+import FallPreventionForm from '@/views/elderly/apply/nine-precautions/fall-prevention-measures/AddForm.vue'
+import EmpyrosisForm from '@/views/elderly/apply/nine-precautions/empyrosis/AddForm.vue'
+import WanderAwayForm from '@/views/elderly/apply/nine-precautions/wander-away/AddForm.vue'
+import CommitSuicideForm from '@/views/elderly/apply/nine-precautions/commit-suicide/AddForm.vue'
+import MMSEForm from '@/views/elderly/apply/nine-precautions/MMSE/AddForm.vue'
+import AttackForm from '@/views/elderly/apply/nine-precautions/attack/AddForm.vue'
+import CommunicationForm from '@/views/elderly/apply/nine-precautions/communication/AddForm.vue'
+import EquilibriumForm from '@/views/elderly/apply/nine-precautions/equilibrium/AddForm.vue'
+import DailyLifeForm from '@/views/elderly/apply/nine-precautions/daily-life/AddForm.vue'
+import NutritionalRiskForm from '@/views/elderly/apply/nine-precautions/nutritional-risk/AddForm.vue'
 
 defineOptions({ name: 'RiskDisclosureStatement' })
 
@@ -53,7 +264,80 @@ const resetQuery = () => {
 // 新增
 const formRef = ref()
 const handleAdd = () => {
-  formRef.value?.open()
+  // formRef.value?.open()
+
+
+}
+
+// 各项评估弹窗引用
+const asphyxiationFormRef = ref()
+const pressureSoresFormRef = ref()
+const fallDownFormRef = ref()
+const fallPreventionFormRef = ref()
+const empyrosisFormRef = ref()
+const wanderAwayFormRef = ref()
+const commitSuicideFormRef = ref()
+const mmseFormRef = ref()
+const attackFormRef = ref()
+const communicationFormRef = ref()
+const equilibriumFormRef = ref()
+const dailyLifeFormRef = ref()
+const nutritionalRiskFormRef = ref()
+
+// 各项评估点击处理方法
+const handleOpenAsphyxiation = (row: any) => {
+  asphyxiationFormRef.value?.open(row.tenantId, row.asphyxiationId, true)
+}
+const handleOpenPressureUlcer = (row: any) => {
+  pressureSoresFormRef.value?.open(row.tenantId, row.pressureSoresId, true)
+}
+const handleOpenFall = (row: any) => {
+  fallDownFormRef.value?.open(row.tenantId, row.fallDownId, true)
+}
+const handleOpenBedFall = (row: any) => {
+  fallPreventionFormRef.value?.open(row.tenantId, row.fallPreventionId, true)
+}
+const handleOpenScald = (row: any) => {
+  empyrosisFormRef.value?.open(row.tenantId, row.empyrosisId, true)
+}
+const handleOpenWandering = (row: any) => {
+  wanderAwayFormRef.value?.open(row.tenantId, row.wanderAwayId, true)
+}
+const handleOpenSuicide = (row: any) => {
+  commitSuicideFormRef.value?.open(row.tenantId, row.commitSuicideId, true)
+}
+const handleOpenMental = (row: any) => {
+  mmseFormRef.value?.open(row.tenantId, row.mmseId, true)
+}
+const handleOpenAttack = (row: any) => {
+  attackFormRef.value?.open(row.tenantId, row.attackId, true)
+}
+const handleOpenPerception = (row: any) => {
+  communicationFormRef.value?.open(row.tenantId, row.communicationId, true)
+}
+const handleOpenBalance = (row: any) => {
+  equilibriumFormRef.value?.open(row.tenantId, row.equilibriumId, true)
+}
+const handleOpenDailyLiving = (row: any) => {
+  dailyLifeFormRef.value?.open(row.tenantId, row.dailyLifeId, true)
+}
+const handleOpenNutrition = (row: any) => {
+  nutritionalRiskFormRef.value?.open(row.tenantId, row.nutritionalRiskId, true)
+}
+
+/**
+ * 根据风险等级获取按钮类型(颜色)
+ * @param riskLevel 风险等级:无风险、低风险、中风险、高风险
+ * @returns Element Plus 按钮类型:success(绿)、info(灰)、warning(黄)、danger(红)、primary(蓝)
+ */
+const getRiskType = (riskLevel: string): string => {
+  if (!riskLevel) return 'info'
+  const level = riskLevel.trim()
+  if (level === '无风险') return 'success'
+  if (level === '低风险') return 'info'
+  if (level === '中风险') return 'warning'
+  if (level === '高风险') return 'danger'
+  return 'primary'
 }
 
 // 编辑
@@ -84,100 +368,7 @@ onMounted(() => {
 })
 </script>
 
-<template>
-  <ContentWrap>
-    <!-- 搜索工作栏 -->
-    <el-form
-      class="-mb-15px"
-      :model="queryParams"
-      ref="queryFormRef"
-      :inline="true"
-      label-width="80px"
-    >
-      <el-form-item label="长者姓名" prop="elderName">
-        <el-input
-          v-model="queryParams.elderName"
-          placeholder="请输入长者姓名"
-          class="!w-240px"
-          @keyup.enter="handleQuery"
-        />
-      </el-form-item>
-<!--      <el-form-item label="楼层" prop="floorName">-->
-<!--        <el-input-->
-<!--          v-model="queryParams.floorName"-->
-<!--          placeholder="请输入楼层"-->
-<!--          class="!w-240px"-->
-<!--          @keyup.enter="handleQuery"-->
-<!--        />-->
-<!--      </el-form-item>-->
-      <el-form-item>
-        <el-button @click="handleQuery">
-          <Icon icon="ep:search" class="mr-5px" /> 搜索
-        </el-button>
-        <el-button @click="resetQuery">
-          <Icon icon="ep:refresh" class="mr-5px" /> 重置
-        </el-button>
-      </el-form-item>
-    </el-form>
-  </ContentWrap>
-
-  <!-- 列表 -->
-  <ContentWrap>
-    <TabBarBtn>
-      <template #next>
-        <el-button type="primary" @click="handleAdd">
-          <Icon icon="ep:plus" class="mr-5px" /> 新增告知书
-        </el-button>
-      </template>
-    </TabBarBtn>
-
-    <el-table v-loading="loading" :data="list" stripe>
-      <el-table-column type="index" label="序号" width="60" align="center" />
-      <el-table-column label="长者姓名" prop="elderName" min-width="100" />
-      <el-table-column label="性别" prop="elderSex" min-width="80">
-        <template #default="{ row }">
-          {{ getDictLabel(DICT_TYPE.SYSTEM_USER_SEX, row.elderSex) }}
-        </template>
-      </el-table-column>
-      <el-table-column label="年龄" prop="elderAge" min-width="80" />
 
-      <el-table-column label="床号" prop="bedName" min-width="200" />
-      <el-table-column label="首次告知日期" prop="firstSignDate" min-width="120">
-        <template #default="{ row }">
-          {{ row.firstSignDate ? formatTime(row.firstSignDate, 'yyyy-MM-dd') : '-' }}
-        </template>
-      </el-table-column>
-      <el-table-column label="第二次告知日期" prop="secondSignDate" min-width="120">
-        <template #default="{ row }">
-          {{ row.secondSignDate ? formatTime(row.secondSignDate, 'yyyy-MM-dd') : '-' }}
-        </template>
-      </el-table-column>
-      <el-table-column label="创建时间" prop="createTime" min-width="150">
-        <template #default="{ row }">
-          {{ row.createTime ? formatTime(row.createTime, 'yyyy-MM-dd HH:mm') : '-' }}
-        </template>
-      </el-table-column>
-      <el-table-column label="操作" width="220" fixed="right">
-        <template #default="{ row }">
-          <el-button link type="primary" @click="handleView(row)">详情</el-button>
-          <el-button link type="primary" @click="handleEdit(row)">编辑</el-button>
-          <el-button link type="danger" @click="handleDelete(row)">删除</el-button>
-        </template>
-      </el-table-column>
-    </el-table>
-
-    <!-- 分页 -->
-    <Pagination
-      :total="total"
-      v-model:page="queryParams.pageNo"
-      v-model:limit="queryParams.pageSize"
-      @pagination="getList"
-    />
-  </ContentWrap>
-
-  <!-- 新增/编辑弹窗 -->
-  <SafetyRiskNoticeForm ref="formRef" @success="getList" />
-</template>
 
 <style scoped lang="scss">
 </style>