Jelajahi Sumber

增加风险之情书功能

unknown 2 hari lalu
induk
melakukan
9b4b1ebc40
21 mengubah file dengan 405 tambahan dan 226 penghapusan
  1. 20 0
      src/api/social-work/index.ts
  2. 5 3
      src/components/business-components/selectElder.vue
  3. 8 18
      src/views/elderly/apply/nine-precautions/MMSE/AddForm.vue
  4. 1 19
      src/views/elderly/apply/nine-precautions/MMSE/index.vue
  5. 19 21
      src/views/elderly/apply/nine-precautions/anti-entertainment/AddForm.vue
  6. 4 2
      src/views/elderly/apply/nine-precautions/anti-entertainment/index.vue
  7. 3 0
      src/views/elderly/apply/nine-precautions/asphyxiation-by-choking/AddForm.vue
  8. 1 0
      src/views/elderly/apply/nine-precautions/attack/AddForm.vue
  9. 0 4
      src/views/elderly/apply/nine-precautions/attack/index.vue
  10. 2 0
      src/views/elderly/apply/nine-precautions/commit-suicide/AddForm.vue
  11. 9 5
      src/views/elderly/apply/nine-precautions/commit-suicide/index.vue
  12. 2 0
      src/views/elderly/apply/nine-precautions/communication/AddForm.vue
  13. 10 3
      src/views/elderly/apply/nine-precautions/fall-down/AddForm.vue
  14. 1 1
      src/views/elderly/apply/nine-precautions/nutritional-risk/AddForm.vue
  15. 190 65
      src/views/elderly/apply/nine-precautions/risk-disclosure-statement/Form.vue
  16. 73 59
      src/views/elderly/apply/nine-precautions/risk-disclosure-statement/index.vue
  17. 6 5
      src/views/elderly/apply/nine-precautions/wander-away/AddForm.vue
  18. 48 0
      src/views/elderly/fee/out-refund/Form.vue
  19. 1 7
      src/views/social-worker/assessment/AttackRiskFactors/index.vue
  20. 1 7
      src/views/social-worker/assessment/SAS/index.vue
  21. 1 7
      src/views/social-worker/assessment/SDS/index.vue

+ 20 - 0
src/api/social-work/index.ts

@@ -890,6 +890,26 @@ export const fallDownExport = async (id: number) => {
 }
 
 
+export const entertainmentPage = async (params: any) => {
+  return await request.get({ url: '/elderly-anti-entertainment/page', params })
+}
+// 删除
+export const entertainmentDelete = async (id: number) => {
+  return await request.delete({ url: `/elderly-anti-entertainment/delete?id=${id}` })
+}
+// 创建
+export const entertainmentCreate = async (data: FallDownFormData) => {
+  return await request.post({ url: '/elderly-anti-entertainment/create', data })
+}
+// 更新
+export const entertainmentUpdate = async (data: FallDownFormData) => {
+  return await request.put({ url: '/elderly-anti-entertainment/update', data })
+}
+// 根据ID获取
+export const entertainmentGetById = async (id: number) => {
+  return await request.get({ url: '/elderly-anti-entertainment/get?id=' + id })
+}
+
 // ==================== 防坠床评估表 ====================
 
 // 防坠床评估表数据接口

+ 5 - 3
src/components/business-components/selectElder.vue

@@ -100,12 +100,14 @@ const toggleTypeFmt = computed(() => {
   return formToggleType.value || false
 })
 
-const upData = async (str,id?:any) => {
-  inputValue.value = str
+const upData = async (str,id?:any, triggerEvent = true) => {
   if(id && id!='NaN'){
     try {
       const res = await getElderInfoById(id)
-      emit('elder', res)
+      inputValue.value = res.id
+      if (triggerEvent) {
+        emit('elder', res)
+      }
       return res
     }catch (e) {}
   }

+ 8 - 18
src/views/elderly/apply/nine-precautions/MMSE/AddForm.vue

@@ -414,23 +414,7 @@ const totalScore = computed(() => {
     (form.structure.score || 0)
 })
 
-/** 风险程度文本 */
-const riskLevelText = computed(() => {
-  const score = totalScore.value
-  if (score >= 27) return '无风险'
-  if (score >= 21) return '低风险'
-  if (score >= 10) return '中风险'
-  return '高风险'
-})
 
-/** 风险程度样式类 */
-const riskLevelClass = computed(() => {
-  const score = totalScore.value
-  if (score >= 27) return 'risk-none'
-  if (score >= 21) return 'risk-low'
-  if (score >= 10) return 'risk-medium'
-  return 'risk-high'
-})
 
 /** 将表单数据序列化为 JSON 对象 */
 const serializeFormData = () => {
@@ -453,7 +437,7 @@ const serializeFormData = () => {
     
     // 总分
     totalScore: totalScore.value,
-    
+    assessScore:totalScore.value,
     // 风险程度
     riskLevel: form.riskLevel || '',
     
@@ -577,7 +561,11 @@ const open = async (tenantId, id?: any, detail: boolean = false) => {
   dataForm.value.tenantId = tenantId
   isDetail.value = detail
   if (id) {
-    title.value = "编辑-MMSE评估"
+    if(detail){
+      title.value = "详情-MMSE评估"
+    }else {
+      title.value = "编辑-MMSE评估"
+    }
     // 加载 MMSE 数据
     await loadAttackRiskData(id)
   } else {
@@ -660,7 +648,9 @@ const submitForm = async () => {
       ...dataForm.value,
       assessData: JSON.stringify(assessData),
       totalScore: totalScore.value,
+      assessScore: totalScore.value,
       assessor: form.assessor,
+      riskLevel: form.riskLevel,
       assessDate: form.assessDate ? dayjs(form.assessDate).format('YYYY-MM-DD') : ''
     }
 

+ 1 - 19
src/views/elderly/apply/nine-precautions/MMSE/index.vue

@@ -120,22 +120,7 @@
 
   <AddForm ref="formRef" @success="getList" />
 
-  <!-- 通用批量导出弹窗 -->
-  <BatchExportDialog
-    :show="showBatchExport"
-    :title="exportConfig.title"
-    :loading="exportLoading"
-    :batch-min="exportConfig.batchMin"
-    :batch-max="exportConfig.batchMax"
-    :count-min="exportConfig.countMin"
-    :count-max="exportConfig.countMax"
-    :default-batch="exportConfig.defaultBatch"
-    :default-count="exportConfig.defaultCount"
-    :description="exportConfig.description"
-    @update:show="showBatchExport = $event"
-    @confirm="handleBatchExport"
-    @cancel="showBatchExport = false"
-  />
+
 
 
   <Import
@@ -155,12 +140,9 @@
 <script setup lang="ts">
 import AddForm from "./AddForm.vue";
 import ButtonAdd from "@/components/ButtonAdd/src/ButtonAdd.vue";
-import ButtonImport from "@/components/ButtonImport/src/ButtonImport.vue";
 import { getRiskLevelInfo } from "@/utils/risk-assessment";
 import { useUserStore } from '@/store/modules/user'
-import {formatTimestamp, getCurrentMonthRange} from "@/utils/dateUtil";
 import Import from "@/components/ImportFile/index.vue";
-import {restraintCreatePage, restraintDelete} from "@/api/elderly/nursing/keep-fit";
 import {mmseDelete, mmseGetPage} from "@/api/social-work";
 const message = useMessage() // 消息弹窗
 const { t } = useI18n() // 国际化

+ 19 - 21
src/views/elderly/apply/nine-precautions/anti-entertainment/AddForm.vue

@@ -58,9 +58,9 @@
                 </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></tr>
+              <tr></tr>
+              <tr></tr>
 
               <!-- 跌倒风险与行动能力 -->
               <tr>
@@ -74,8 +74,8 @@
                 </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></tr>
+              <tr></tr>
 
               <!-- 走失风险与认知能力 -->
               <tr>
@@ -89,8 +89,8 @@
                 </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></tr>
+              <tr></tr>
 
               <!-- 心理健康状况 -->
               <tr>
@@ -104,8 +104,8 @@
                 </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></tr>
+              <tr></tr>
 
               <!-- 他伤及自伤风险 -->
               <tr>
@@ -243,9 +243,7 @@
 import { computed, ref, reactive } from 'vue'
 import dayjs from 'dayjs'
 import {
-  fallDownCreate,
-  fallDownGetById,
-  fallDownUpdate
+  entertainmentCreate, entertainmentGetById, entertainmentUpdate,
 } from "@/api/social-work";
 
 const message = useMessage()
@@ -383,17 +381,17 @@ const open = async (tenantId: any, id?: any, detail: boolean = false) => {
   dataForm.value.tenantId = tenantId
   isDetail.value = detail
   if (id) {
-    title.value = "编辑-跌倒风险评估表"
+    title.value = "编辑-防文娱意外评估表"
     await loadData(id)
   } else {
-    title.value = "新增-跌倒风险评估表"
+    title.value = "新增-防文娱意外评估表"
   }
 }
 
 /** 加载评估数据 */
 const loadData = async (id: number) => {
   try {
-    const res = await fallDownGetById(id)
+    const res = await entertainmentGetById(id)
     if (res) {
       dataForm.value.elderName = res.elderName || ''
       dataForm.value.elderId = res.elderId || ''
@@ -451,10 +449,10 @@ const submitForm = async () => {
     }
 
     if (dataForm.value.id) {
-      await fallDownUpdate(payload)
+      await entertainmentUpdate(payload)
       message.success(t('common.updateSuccess'))
     } else {
-      await fallDownCreate(payload)
+      await entertainmentCreate(payload)
       message.success(t('common.createSuccess'))
     }
     dialogVisible.value = false
@@ -544,7 +542,7 @@ const handleExport = () => {
     <html>
     <head>
       <meta charset="UTF-8">
-      <title>跌倒风险评估表 - ${dataForm.value.elderName || ''}</title>
+      <title>防文娱活动意外评估表 - ${dataForm.value.elderName || ''}</title>
       <style>
         @media print {
           @page { size: A4 portrait; margin: 15mm; }
@@ -699,7 +697,7 @@ const handleExport = () => {
     </head>
     <body>
       <div class="header">
-        <h1>跌倒风险评估表</h1>
+        <h1>防文娱活动意外评估表</h1>
       </div>
 
       <div class="info-section">
@@ -830,7 +828,7 @@ const rules = {
     }
 
     .table-wrapper {
-          border: 2px solid #333;
+          border: 1px solid #f0f0f0;
           border-radius: 4px;
           overflow: hidden;
         }
@@ -849,7 +847,7 @@ const rules = {
             font-weight: bold;
 
             th {
-              border-bottom: 2px solid #333;
+              border-bottom: 1px solid #f0f0f0;
             }
           }
 

+ 4 - 2
src/views/elderly/apply/nine-precautions/anti-entertainment/index.vue

@@ -122,6 +122,8 @@ import ButtonAdd from "@/components/ButtonAdd/src/ButtonAdd.vue";
 import { useUserStore } from '@/store/modules/user'
 import { getCurrentMonthRange } from "@/utils/dateUtil";
 import {
+  entertainmentDelete,
+  entertainmentPage,
   fallDownDelete,
   fallDownPage
 } from "@/api/social-work";
@@ -168,7 +170,7 @@ const handleBatchExport = async (batch: number, count: number) => {
 const getList = async () => {
   loading.value = true
   try {
-    const data = await fallDownPage(queryParams)
+    const data = await entertainmentPage(queryParams)
     list.value = data.list
     total.value = data.total
   } finally {
@@ -219,7 +221,7 @@ const openClose = async (item: any) => {
     const res = await message.confirm('确定要删除吗?', '提示')
     if (res == 'confirm') {
       try {
-        const res = await fallDownDelete(item.id)
+        const res = await entertainmentDelete(item.id)
         if (res) {
           message.success(t('common.updateSuccess'))
           await getList()

+ 3 - 0
src/views/elderly/apply/nine-precautions/asphyxiation-by-choking/AddForm.vue

@@ -8,6 +8,7 @@
     :destroy-on-close="true"
     size="85%"
     :before-close="handleClosed"
+    @keydown.enter="!isDetail && submitForm()"
   >
     <div class="asphyxiation-form">
       <h1 class="form-title">防噎食评估表</h1>
@@ -347,6 +348,7 @@ const loadData = async (id: number) => {
         const formData = JSON.parse(res.assessData)
         deserializeFormData(formData)
       }
+      updateRiskLevel()
     }
   } catch (error) {
     message.error('加载评估数据失败')
@@ -373,6 +375,7 @@ const submitForm = async () => {
       assessData: JSON.stringify(assessData),
       riskLevel: form.riskLevel,
       assessor: form.assessment.assessor || '',
+      assessScore: form.assessment.level||0,
       assessDate: form.assessment.assessDate ? dayjs(form.assessment.assessDate).format('YYYY-MM-DD') : ''
     }
 

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

@@ -522,6 +522,7 @@ const submitForm = async () => {
       attackLevel: form.attackLevel,
       riskLevel: form.riskLevel,
       assessor: form.assessor,
+      assessScore: form.attackLevel,
       assessDate: form.assessDate ? dayjs(form.assessDate).format('YYYY-MM-DD') : ''
     }
 

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

@@ -161,10 +161,6 @@ import Import from "@/components/ImportFile/index.vue";
 import {restraintCreatePage, restraintDelete} from "@/api/elderly/nursing/keep-fit";
 import {
   attackRiskDelete, attackRiskPage,
-  ngasrDelete,
-  ngasrPage,
-  perceptionDelete,
-  perceptionPage
 } from "@/api/social-work";
 import { getRiskLevelInfo } from "@/utils/risk-assessment";
 const message = useMessage() // 消息弹窗

+ 2 - 0
src/views/elderly/apply/nine-precautions/commit-suicide/AddForm.vue

@@ -430,6 +430,8 @@ const submitForm = async () => {
       assessData: JSON.stringify(assessData),
       totalScore: totalScore.value,
       assessor: form.assessor,
+      riskLevel: form.riskLevel,
+      assessScore: totalScore.value,
       assessDate: form.assessDate ? dayjs(form.assessDate).format('YYYY-MM-DD') : ''
     }
 

+ 9 - 5
src/views/elderly/apply/nine-precautions/commit-suicide/index.vue

@@ -72,7 +72,13 @@
       <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="200" show-overflow-tooltip/>
       <el-table-column prop="assessDate" header-align="center" align="center" label="记录日期" min-width="200" show-overflow-tooltip/>
-
+      <el-table-column header-align="center" align="center" label="风险等级" min-width="200" show-overflow-tooltip>
+        <template #default="scope">
+          <el-tag v-if="getRiskLevelInfo(scope.row.assessData).text" :type="getRiskLevelInfo(scope.row.assessData).type">
+            {{ getRiskLevelInfo(scope.row.assessData).text }}
+          </el-tag>
+        </template>
+      </el-table-column>
       <el-table-column prop="creator" header-align="center" align="center" label="记录人" min-width="200" show-overflow-tooltip/>
 
 
@@ -148,12 +154,10 @@
 <script setup lang="ts">
 import AddForm from "./AddForm.vue";
 import ButtonAdd from "@/components/ButtonAdd/src/ButtonAdd.vue";
-import ButtonImport from "@/components/ButtonImport/src/ButtonImport.vue";
 import { useUserStore } from '@/store/modules/user'
-import {formatTimestamp, getCurrentMonthRange} from "@/utils/dateUtil";
 import Import from "@/components/ImportFile/index.vue";
-import {restraintCreatePage, restraintDelete} from "@/api/elderly/nursing/keep-fit";
-import {ngasrDelete, ngasrPage, perceptionDelete, perceptionPage} from "@/api/social-work";
+import {ngasrDelete, ngasrPage} from "@/api/social-work";
+import {getRiskLevelInfo} from "@/utils/risk-assessment";
 const message = useMessage() // 消息弹窗
 const { t } = useI18n() // 国际化
 const userStore = useUserStore()

+ 2 - 0
src/views/elderly/apply/nine-precautions/communication/AddForm.vue

@@ -430,6 +430,8 @@ const submitForm = async () => {
       assessData: JSON.stringify(assessData),
       totalScore: totalScore.value,
       assessor: form.assessor,
+      riskLevel: form.riskLevel,
+      assessScore: totalScore.value,
       assessDate: form.assessDate ? dayjs(form.assessDate).format('YYYY-MM-DD') : ''
     }
 

+ 10 - 3
src/views/elderly/apply/nine-precautions/fall-down/AddForm.vue

@@ -750,7 +750,7 @@ const rules = {
     .assessment-table {
       width: 100%;
       border-collapse: collapse;
-      border: 1px solid #e4e7ed;
+      border: 2px solid #909399;
       border-radius: 4px;
       overflow: hidden;
 
@@ -762,12 +762,17 @@ const rules = {
       thead {
         background-color: #f5f7fa;
         font-weight: bold;
+
+        th {
+          border-bottom: 1px solid #f0f0f0;
+        }
       }
 
       .col-factor {
         width: 15%;
         text-align: center;
         font-weight: bold;
+        border-right: 1px solid #f0f0f0;
       }
 
       .col-standard {
@@ -776,8 +781,9 @@ const rules = {
 
         .el-radio-group {
           display: flex;
-          flex-direction: column;
-          gap: 8px;
+          flex-direction: row;
+          flex-wrap: wrap;
+          gap: 20px;
         }
       }
 
@@ -786,6 +792,7 @@ const rules = {
         text-align: center;
         font-weight: bold;
         color: #409eff;
+        border-left: 1px solid #f0f0f0;
       }
     }
 

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

@@ -28,7 +28,7 @@
               </el-form-item>
             </el-col>
             <el-col :span="6">
-              <el-form-item label="时间">
+              <el-form-item label="评估日期">
                 <el-date-picker
                   v-model="form.assessDate"
                   type="date"

+ 190 - 65
src/views/elderly/apply/nine-precautions/risk-disclosure-statement/Form.vue

@@ -19,7 +19,7 @@
     >
       <!-- 长者搜索 - 参照 ProcessForm.vue 中的 SelectElder 使用方式 -->
       <div class="section-title">长者信息</div>
-      <el-row :gutter="20">
+      <el-row :gutter="0">
         <el-col :span="12">
           <el-form-item label="长者姓名" prop="elderId">
             <SelectElder
@@ -32,11 +32,11 @@
             />
           </el-form-item>
         </el-col>
-        <el-col :span="12">
-          <el-form-item label="证件号码">
-            <TgInput v-model="dataForm.idCard" disabled />
-          </el-form-item>
-        </el-col>
+<!--        <el-col :span="12">-->
+<!--          <el-form-item label="证件号码">-->
+<!--            <TgInput v-model="dataForm.idCard" disabled />-->
+<!--          </el-form-item>-->
+<!--        </el-col>-->
       </el-row>
 
       <!-- 长者详情展示 - 对应图片中的表一表头信息 -->
@@ -74,19 +74,20 @@
             <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-project">{{ item.name }}</td>
                 <td class="col-level">
-                  <el-select 
-                    v-model="item.riskLevel" 
-                    placeholder="请选择" 
-                    style="width: 120px"
+                  <el-select
+                    v-model="item.recordId"
+                    placeholder="请选择"
+                    style="width: 180px"
                     :disabled="isView"
+                    @change="(val: any) => handleRiskLevelChange(item, val)"
                   >
-                    <el-option 
-                      v-for="option in getRiskOptions(item.key)" 
-                      :key="option.value" 
-                      :label="option.label" 
-                      :value="option.value" 
+                    <el-option
+                      v-for="option in getRiskOptions(item.key)"
+                      :key="option.value"
+                      :label="option.label"
+                      :value="option.value"
                     />
                   </el-select>
                 </td>
@@ -105,13 +106,14 @@
         <div class="next-assess-date">
           <span class="date-label">预计下次评估日期:</span>
           <el-date-picker
-            v-model="dataForm.nextAssessDate"
+            v-model="dataForm.firstRisk"
+            value-format="YYYY-MM-DD"
             type="date"
             placeholder="选择日期"
             style="width: 150px"
             :disabled="isView"
           />
-          <span class="date-value">{{ dataForm.nextAssessDate ? formatDate(dataForm.nextAssessDate) : '无' }}</span>
+          <span class="date-value">{{ dataForm.firstRisk ? formatDate(dataForm.firstRisk) : '无' }}</span>
         </div>
 
         <!-- 告知签名区域 -->
@@ -157,7 +159,20 @@ import {
   getSafetyRiskNoticeById
 } from '@/api/elderly/apply/check-in'
 import { getTenantId } from '@/utils/auth'
+import { useUserStore } from '@/store/modules/user'
+import {
+  asphyxiationPage,
+  pressureSoresPage,
+  fallDownPage,
+  fallPreventionPage,
+  burnPreventionPage,
+  wanderAwayPage,
+  ngasrPage,
+  entertainmentPage,
+  mmseGetPage
+} from '@/api/social-work'
 const message = useMessage() // 消息弹窗
+const userStore = useUserStore()
 
 defineOptions({ name: 'RiskDisclosureStatementForm' })
 
@@ -175,17 +190,17 @@ const selectElderRef = ref()
 // 长者详情
 const elderDetail = ref<any>({})
 
-// 风险项目表格数据
+// 风险项目表格数据 - name 用于匹配接口
 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 }
+  { key: 'asphyxiation', name: '防噎食评估', api: asphyxiationPage, recordId: null as any, riskLevel: '', lowChecked: false, mediumChecked: false, highChecked: false },
+  { key: 'pressureUlcer', name: '防压疮评估', api: pressureSoresPage, recordId: null as any, riskLevel: '', lowChecked: false, mediumChecked: false, highChecked: false },
+  { key: 'fall', name: '防跌倒风险评估', api: fallDownPage, recordId: null as any, riskLevel: '', lowChecked: false, mediumChecked: false, highChecked: false },
+  { key: 'bedFall', name: '防坠床评估', api: fallPreventionPage, recordId: null as any, riskLevel: '', lowChecked: false, mediumChecked: false, highChecked: false },
+  { key: 'scald', name: '防烫伤评估', api: burnPreventionPage, recordId: null as any, riskLevel: '', lowChecked: false, mediumChecked: false, highChecked: false },
+  { key: 'wandering', name: '防走失风险评估', api: wanderAwayPage, recordId: null as any, riskLevel: '', lowChecked: false, mediumChecked: false, highChecked: false },
+  { key: 'selfHarm', name: '防自伤和他伤', api: ngasrPage, recordId: null as any, riskLevel: '', lowChecked: false, mediumChecked: false, highChecked: false },
+  { key: 'foodDrug', name: '防食品药品误食评估', api: mmseGetPage, recordId: null as any, riskLevel: '', lowChecked: false, mediumChecked: false, highChecked: false },
+  { key: 'entertainment', name: '防文娱活动意外', api: entertainmentPage, recordId: null as any, riskLevel: '', lowChecked: false, mediumChecked: false, highChecked: false }
 ])
 
 // 接口返回的风险数据选项(模拟数据,实际从接口获取)
@@ -209,37 +224,122 @@ const getRiskOptions = (key: string) => {
     return options
   }
   // 默认选项
-  return [
-    { label: '无风险', value: 'none' },
-    { label: '低风险', value: 'low' },
-    { label: '中风险', value: 'medium' },
-    { label: '高风险', value: 'high' }
-  ]
+  return []
 }
 
-// 加载长者风险数据(从接口获取)
-const loadElderRiskData = async (elderId: string) => {
+// 加载长者风险数据(动态调用各九防接口)
+// preserveSelection: 是否保留已保存的选择(用于编辑模式)
+const loadElderRiskData = async (elderId: string, preserveSelection = false) => {
   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' }]
+    // 遍历每个风险项目,动态调用对应的接口
+    for (const item of riskTableItems.value) {
+      if (item.api && typeof item.api === 'function') {
+        try {
+          const params = {
+            pageNo: 1,
+            pageSize: 100,
+            elderId: elderId
+          }
+          const res = await item.api(params)
+          if (res && res.list && res.list.length > 0) {
+            // 解析所有记录,从 assessData 中获取 riskLevel
+            const options: any[] = []
+            res.list.forEach((record: any) => {
+              let riskLevel = record.riskLevel || 'none'
+              let assessDate = record.assessDate || ''
+              // 尝试从 assessData 解析 riskLevel
+              if (record.assessData) {
+                try {
+                  const assessData = JSON.parse(record.assessData)
+                  if (assessData.riskLevel) {
+                    riskLevel = assessData.riskLevel
+                  }
+                  // 优先使用 assessData 中的 assessDate
+                  if (assessData.assessDate) {
+                    assessDate = assessData.assessDate
+                  }
+                } catch (e) {
+                  console.error('解析 assessData 失败', e)
+                }
+              }
+              // 构建选项标签:风险等级 + 评估日期
+              const dateStr = assessDate ? ` (${assessDate})` : ''
+              options.push({
+                label: getRiskLevelLabel(riskLevel) + dateStr,
+                value: record.id, // 使用记录ID作为value,确保唯一性
+                riskLevel: riskLevel, // 存储riskLevel用于后续使用
+                recordId: record.id,
+                assessDate: assessDate
+              })
+            })
+            // 按评估日期降序排序,最新的排在前面
+            options.sort((a, b) => {
+              const dateA = a.assessDate ? new Date(a.assessDate).getTime() : 0
+              const dateB = b.assessDate ? new Date(b.assessDate).getTime() : 0
+              return dateB - dateA
+            })
+            // 设置选项数据
+            riskOptionsMap.value[item.key] = options
+
+            // 如果不是保留选择模式,则默认选中日期最新的一条记录
+            if (!preserveSelection) {
+              const latestRecord = options[0]
+              item.recordId = latestRecord.recordId // 存储选中的记录ID
+              item.riskLevel = latestRecord.riskLevel // 存储riskLevel用于显示和提交
+            } else {
+              // 保留选择模式下,根据已保存的 recordId 从 options 中找到对应的选项并更新 riskLevel
+              const selectedOption = options.find((opt: any) => opt.value === item.recordId)
+              if (selectedOption) {
+                item.riskLevel = selectedOption.riskLevel // 更新 riskLevel 为最新的值
+              }
+            }
+          } else {
+            // 如果没有数据且不是保留选择模式,清空当前项的选择
+            if (!preserveSelection) {
+              item.recordId = null
+              item.riskLevel = ''
+            }
+          }
+        } catch (err) {
+          console.error(`获取${item.name}数据失败`, err)
+        }
+      }
     }
-    riskOptionsMap.value = mockData
   } catch (e) {
     console.error('获取风险数据失败', e)
   }
 }
 
+// 获取风险等级标签
+const getRiskLevelLabel = (riskLevel: string) => {
+  switch (riskLevel) {
+    case 'none': return '无风险'
+    case 'low': return '低风险'
+    case 'medium': return '中风险'
+    case 'high': return '高风险'
+    default: return '无风险'
+  }
+}
+
+// 根据风险等级更新复选框状态
+const updateRiskCheckboxes = (item: any, riskLevel: string) => {
+  item.lowChecked = riskLevel === 'low'
+  item.mediumChecked = riskLevel === 'medium'
+  item.highChecked = riskLevel === 'high'
+}
+
+// 处理风险等级选择变化
+const handleRiskLevelChange = (item: any, recordId: any) => {
+  // 从选项中查找对应的riskLevel
+  const options = getRiskOptions(item.key)
+  const selectedOption = options.find((opt: any) => opt.value === recordId)
+  if (selectedOption) {
+    item.riskLevel = selectedOption.riskLevel
+    // 根据风险等级更新复选框
+    //updateRiskCheckboxes(item, selectedOption.riskLevel)
+  }
+}
+
 // 表单数据
 const dataForm = reactive({
   id: undefined,
@@ -280,6 +380,25 @@ const handleSelectElder = async (item: any) => {
   if (item && item.id) {
     dataForm.elderId = item.id
     dataForm.idCard = item.idCard || ''
+    // 清空之前的风险数据和选项
+    riskOptionsMap.value = {
+      asphyxiation: [],
+      pressureUlcer: [],
+      fall: [],
+      bedFall: [],
+      scald: [],
+      wandering: [],
+      selfHarm: [],
+      foodDrug: [],
+      entertainment: []
+    }
+    riskTableItems.value.forEach(tableItem => {
+      tableItem.recordId = null
+      tableItem.riskLevel = ''
+      tableItem.lowChecked = false
+      tableItem.mediumChecked = false
+      tableItem.highChecked = false
+    })
     // 获取长者详情
     try {
       const res = await getElderInfoById(item.id)
@@ -317,7 +436,8 @@ const open = async (row?: any, viewMode = false) => {
           if (saved) {
             return {
               ...item,
-              riskLevel: saved.level || saved.id || '',
+              recordId: saved.recordId || saved.id || null, // 恢复选中的记录ID(兼容旧数据)
+              riskLevel: saved.level || '',
               lowChecked: saved.remark?.low || false,
               mediumChecked: saved.remark?.medium || false,
               highChecked: saved.remark?.high || false
@@ -329,13 +449,16 @@ const open = async (row?: any, viewMode = false) => {
         if (parsedData.otherRisk !== undefined) {
           dataForm.otherRisk = parsedData.otherRisk
         }
+
+        // 加载选项数据,但不覆盖已保存的选择
+        await loadElderRiskData(res.elderId, true)
       }
-      // 获取长者详情 - 调用 SelectElder 的 upData 方法设置显示
+      // 获取长者详情
       if (res.elderId) {
         const elderRes = await getElderInfoById(res.elderId)
         elderDetail.value = elderRes
-        // 调用 SelectElder 组件的 upData 方法来设置值和触发 elder 事件
-        selectElderRef.value?.upData?.(res.elderName, res.elderId)
+        // 调用 SelectElder 组件的 upData 方法来设置值,但不触发 elder 事件(避免重复加载风险数据)
+        selectElderRef.value?.upData?.(res.elderName, res.elderId, false)
       }
     } catch (e) {
       console.error('获取详情失败', e)
@@ -379,15 +502,15 @@ const resetForm = () => {
   })
   elderDetail.value = {}
   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 }
+    { key: 'asphyxiation', name: '防噎食评估', api: asphyxiationPage, recordId: null as any, riskLevel: '', lowChecked: false, mediumChecked: false, highChecked: false },
+    { key: 'pressureUlcer', name: '防压疮评估', api: pressureSoresPage, recordId: null as any, riskLevel: '', lowChecked: false, mediumChecked: false, highChecked: false },
+    { key: 'fall', name: '防跌倒风险评估', api: fallDownPage, recordId: null as any, riskLevel: '', lowChecked: false, mediumChecked: false, highChecked: false },
+    { key: 'bedFall', name: '防坠床评估', api: fallPreventionPage, recordId: null as any, riskLevel: '', lowChecked: false, mediumChecked: false, highChecked: false },
+    { key: 'scald', name: '防烫伤评估', api: burnPreventionPage, recordId: null as any, riskLevel: '', lowChecked: false, mediumChecked: false, highChecked: false },
+    { key: 'wandering', name: '防走失风险评估', api: wanderAwayPage, recordId: null as any, riskLevel: '', lowChecked: false, mediumChecked: false, highChecked: false },
+    { key: 'selfHarm', name: '防自伤和他伤', api: ngasrPage, recordId: null as any, riskLevel: '', lowChecked: false, mediumChecked: false, highChecked: false },
+    { key: 'foodDrug', name: '防食品药品误食评估', api: mmseGetPage, recordId: null as any, riskLevel: '', lowChecked: false, mediumChecked: false, highChecked: false },
+    { key: 'entertainment', name: '防文娱活动意外', api: entertainmentPage, recordId: null as any, riskLevel: '', lowChecked: false, mediumChecked: false, highChecked: false }
   ]
   riskOptionsMap.value = {
     asphyxiation: [],
@@ -420,7 +543,7 @@ const submitForm = async () => {
     const riskDataObj: Record<string, any> = {}
     riskTableItems.value.forEach(item => {
       riskDataObj[item.key] = {
-        id: item.riskLevel, // 风险程度ID
+        id: item.recordId, // 选中的评估记录ID
         level: item.riskLevel, // 风险等级
         // 备注信息
         remark: {
@@ -466,6 +589,7 @@ const handleExport = () => {
   const elderAge = elderDetail.value.elderAge || ''
   const bedName = elderDetail.value.bedName || ''
   const nurseLevelName = elderDetail.value.nurseLevelName || ''
+  const tenantName = userStore.getTenantName || '' // 当前登录的机构名称
 
   // 构建风险表格HTML
   let riskTableHtml = ''
@@ -521,6 +645,7 @@ const handleExport = () => {
     </head>
     <body>
       <div class="print-container">
+        <div class="tenant-name" style="text-align: center; font-size: 18px; font-weight: bold; margin-bottom: 10px;">${tenantName}</div>
         <div class="title">服务安全风险知情告知书</div>
         
         <div class="info-row">
@@ -554,7 +679,7 @@ const handleExport = () => {
         </table>
 
         <div class="next-date">
-          <strong>预计下次评估日期:</strong>${nextAssessDate}
+          <strong>预计下次评估日期:</strong>${dataForm.firstRisk}
         </div>
 
         <div class="signature-section">

+ 73 - 59
src/views/elderly/apply/nine-precautions/risk-disclosure-statement/index.vue

@@ -67,76 +67,63 @@
       </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="bedName" width="200" align="center"/>
+      <el-table-column label="合同号" prop="bedName" width="150" align="center"/>
+      <el-table-column label="护理级别" prop="bedName" width="150" 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>
+          <el-tag :type="getRiskType(row.riskData?.asphyxiation?.level)" :class="{ 'cursor-pointer': row.riskData?.asphyxiation?.id }" @click="row.riskData?.asphyxiation?.id && handleOpenAsphyxiation(row.riskData?.asphyxiation)">{{ getRiskLevelText(row.riskData?.asphyxiation?.level || '-') }}</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>
+          <el-tag :type="getRiskType(row.riskData?.pressureUlcer?.level)" :class="{ 'cursor-pointer': row.riskData?.pressureUlcer?.id }" @click="row.riskData?.pressureUlcer?.id && handleOpenPressureUlcer(row.riskData?.pressureUlcer)">{{ getRiskLevelText(row.riskData?.pressureUlcer?.level || '-') }}</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>
+          <el-tag :type="getRiskType(row.riskData?.fall?.level)" :class="{ 'cursor-pointer': row.riskData?.fall?.id }" @click="row.riskData?.fall?.id && handleOpenFall(row.riskData?.fall)">{{ getRiskLevelText(row.riskData?.fall?.level || '-') }}</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>
+          <el-tag :type="getRiskType(row.riskData?.bedFall?.level)" :class="{ 'cursor-pointer': row.riskData?.bedFall?.id }" @click="row.riskData?.bedFall?.id && handleOpenBedFall(row.riskData?.bedFall)">{{ getRiskLevelText(row.riskData?.bedFall?.level || '-') }}</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>
+          <el-tag :type="getRiskType(row.riskData?.scald?.level)" :class="{ 'cursor-pointer': row.riskData?.scald?.id }" @click="row.riskData?.scald?.id && handleOpenScald(row.riskData?.scald)">{{ getRiskLevelText(row.riskData?.scald?.level || '-') }}</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>
+          <el-tag :type="getRiskType(row.riskData?.wandering?.level)" :class="{ 'cursor-pointer': row.riskData?.wandering?.id }" @click="row.riskData?.wandering?.id && handleOpenWandering(row.riskData?.wandering)">{{ getRiskLevelText(row.riskData?.wandering?.level || '-') }}</el-tag>
         </template>
       </el-table-column>
-      <el-table-column label="防自评估" prop="suicideRisk" width="130" align="center" >
+      <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>
+          <el-tag :type="getRiskType(row.riskData?.selfHarm?.level)" :class="{ 'cursor-pointer': row.riskData?.selfHarm?.id }" @click="row.riskData?.selfHarm?.id && handleOpenSuicide(row.riskData?.selfHarm)">{{ getRiskLevelText(row.riskData?.selfHarm?.level || '-') }}</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" >
+      <el-table-column label="防食品药品误食评估" prop="perceptionRisk" width="152" align="center" >
         <template #default="{ row }">
-          <el-tag :type="getRiskType(row.attackRisk)" @click="handleOpenAttack(row)">{{ row.attackRisk || '-' }}</el-tag>
+          <el-tag :type="getRiskType(row.riskData?.foodDrug?.level)" :class="{ 'cursor-pointer': row.riskData?.foodDrug?.id }" @click="row.riskData?.foodDrug?.id && handleOpenMental(row.riskData?.foodDrug)">{{ getRiskLevelText(row.riskData?.foodDrug?.level || '-') }}</el-tag>
         </template>
       </el-table-column>
-      <el-table-column label="感知觉与沟通评估" prop="perceptionRisk" width="142" align="center" >
+      <el-table-column label="防文娱活动意外" prop="balanceRisk" width="130" align="center" >
         <template #default="{ row }">
-          <el-tag :type="getRiskType(row.perceptionRisk)" @click="handleOpenPerception(row)">{{ row.perceptionRisk || '-' }}</el-tag>
+          <el-tag :type="getRiskType(row.riskData?.entertainment?.level)" :class="{ 'cursor-pointer': row.riskData?.entertainment?.id }" @click="row.riskData?.entertainment?.id && handleOpenBalance(row.riskData?.entertainment)">{{ getRiskLevelText(row.riskData?.entertainment?.level || '-') }}</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" >
+
+      <el-table-column label="记录时间" prop="bedName" width="200" align="center">
         <template #default="{ row }">
-          <el-tag :type="getRiskType(row.nutritionRisk)" @click="handleOpenNutrition(row)">{{ row.nutritionRisk || '-' }}</el-tag>
+          {{formatToDateTime(row.createTime)}}
         </template>
       </el-table-column>
+      <el-table-column label="记录人" prop="creator" width="150" align="center"/>
 
      <el-table-column label="操作" align="center" width="200" fixed="right">
         <template #default="scope">
@@ -188,8 +175,7 @@
   <CommitSuicideForm ref="commitSuicideFormRef" />
   <MMSEForm ref="mmseFormRef" />
   <AttackForm ref="attackFormRef" />
-  <CommunicationForm ref="communicationFormRef" />
-  <EquilibriumForm ref="equilibriumFormRef" />
+  <AntiEntertainmentForm ref="equilibriumFormRef" />
   <DailyLifeForm ref="dailyLifeFormRef" />
   <NutritionalRiskForm ref="nutritionalRiskFormRef" />
 
@@ -214,10 +200,12 @@ import CommitSuicideForm from '@/views/elderly/apply/nine-precautions/commit-sui
 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 AntiEntertainmentForm from '@/views/elderly/apply/nine-precautions/anti-entertainment/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'
-
+import {useUserStore} from "@/store/modules/user";
+import {formatToDateTime} from "@/utils/dateUtil";
+const userStore = useUserStore()
 defineOptions({ name: 'RiskDisclosureStatement' })
 
 const message = useMessage()
@@ -233,16 +221,30 @@ const queryParams = reactive({
   pageNo: 1,
   pageSize: 10,
   elderName: undefined,
-  floorName: undefined
+  floorName: undefined,
+  tenantIds: userStore.orgTenantId
 })
 const queryFormRef = ref()
 
+// 解析 riskData JSON 字符串
+const parseRiskData = (row: any) => {
+  if (!row.riskData) return {}
+  try {
+    return typeof row.riskData === 'string' ? JSON.parse(row.riskData) : row.riskData
+  } catch (e) {
+    return {}
+  }
+}
+
 // 获取列表
 const getList = async () => {
   loading.value = true
   try {
     const data = await getSafetyRiskNoticePage(queryParams)
-    list.value = data.list || []
+    list.value = (data.list || []).map((item: any) => ({
+      ...item,
+      riskData: parseRiskData(item)
+    }))
     total.value = data.total || 0
   } finally {
     loading.value = false
@@ -264,7 +266,7 @@ const resetQuery = () => {
 // 新增
 const formRef = ref()
 const handleAdd = () => {
-  // formRef.value?.open()
+   formRef.value?.open()
 
 
 }
@@ -286,57 +288,69 @@ const nutritionalRiskFormRef = ref()
 
 // 各项评估点击处理方法
 const handleOpenAsphyxiation = (row: any) => {
-  asphyxiationFormRef.value?.open(row.tenantId, row.asphyxiationId, true)
+  asphyxiationFormRef.value?.open(queryParams.tenantIds[0], row.id, true)
 }
 const handleOpenPressureUlcer = (row: any) => {
-  pressureSoresFormRef.value?.open(row.tenantId, row.pressureSoresId, true)
+  pressureSoresFormRef.value?.open(queryParams.tenantIds[0], row.id, true)
 }
 const handleOpenFall = (row: any) => {
-  fallDownFormRef.value?.open(row.tenantId, row.fallDownId, true)
+  fallDownFormRef.value?.open(queryParams.tenantIds[0], row.id, true)
 }
 const handleOpenBedFall = (row: any) => {
-  fallPreventionFormRef.value?.open(row.tenantId, row.fallPreventionId, true)
+  fallPreventionFormRef.value?.open(queryParams.tenantIds[0], row.id, true)
 }
 const handleOpenScald = (row: any) => {
-  empyrosisFormRef.value?.open(row.tenantId, row.empyrosisId, true)
+  empyrosisFormRef.value?.open(queryParams.tenantIds[0], row.id, true)
 }
 const handleOpenWandering = (row: any) => {
-  wanderAwayFormRef.value?.open(row.tenantId, row.wanderAwayId, true)
+  wanderAwayFormRef.value?.open(queryParams.tenantIds[0], row.id, true)
 }
 const handleOpenSuicide = (row: any) => {
-  commitSuicideFormRef.value?.open(row.tenantId, row.commitSuicideId, true)
+  commitSuicideFormRef.value?.open(queryParams.tenantIds[0], row.id, true)
 }
 const handleOpenMental = (row: any) => {
-  mmseFormRef.value?.open(row.tenantId, row.mmseId, true)
+  mmseFormRef.value?.open(queryParams.tenantIds[0], row.id, true)
 }
 const handleOpenAttack = (row: any) => {
-  attackFormRef.value?.open(row.tenantId, row.attackId, true)
+  attackFormRef.value?.open(queryParams.tenantIds[0], row.id, true)
 }
 const handleOpenPerception = (row: any) => {
-  communicationFormRef.value?.open(row.tenantId, row.communicationId, true)
+  communicationFormRef.value?.open(queryParams.tenantIds[0], row.id, true)
 }
 const handleOpenBalance = (row: any) => {
-  equilibriumFormRef.value?.open(row.tenantId, row.equilibriumId, true)
+  equilibriumFormRef.value?.open(queryParams.tenantIds[0], row.id, true)
 }
 const handleOpenDailyLiving = (row: any) => {
-  dailyLifeFormRef.value?.open(row.tenantId, row.dailyLifeId, true)
+  dailyLifeFormRef.value?.open(queryParams.tenantIds[0], row.id, true)
 }
 const handleOpenNutrition = (row: any) => {
-  nutritionalRiskFormRef.value?.open(row.tenantId, row.nutritionalRiskId, true)
+  nutritionalRiskFormRef.value?.open(queryParams.tenantIds[0], row.id, true)
+}
+
+
+// 获取风险等级文本
+const getRiskLevelText = (riskLevel: string) => {
+  switch (riskLevel) {
+    case 'none': return '无风险'
+    case 'low': return '低风险'
+    case 'medium': return '中度风险'
+    case 'high': return '高风险'
+    default: return '-'
+  }
 }
 
 /**
  * 根据风险等级获取按钮类型(颜色)
- * @param riskLevel 风险等级:无风险、低风险、中风险、高风险
+ * @param riskLevel 风险等级:none(无风险)low(低风险)medium(中风险)high(高风险)
  * @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'
+  const level = riskLevel.trim().toLowerCase()
+  if (level === 'none') return 'success'
+  if (level === 'low') return 'info'
+  if (level === 'medium') return 'warning'
+  if (level === 'high') return 'danger'
   return 'primary'
 }
 

+ 6 - 5
src/views/elderly/apply/nine-precautions/wander-away/AddForm.vue

@@ -927,9 +927,10 @@ const rules = {
     .assessment-table {
       width: 100%;
       border-collapse: collapse;
-      border: 1px solid #e4e7ed;
+      border: 3px solid #606266;
       border-radius: 4px;
       overflow: hidden;
+      box-shadow: 0 0 0 1px #606266;
 
       thead {
         background-color: #f5f7fa;
@@ -937,7 +938,7 @@ const rules = {
 
         th {
           padding: 12px;
-          border: 1px solid #e4e7ed;
+          border: 1px solid #909399;
           text-align: center;
           font-weight: bold;
         }
@@ -946,7 +947,7 @@ const rules = {
       tbody {
         td {
           padding: 12px;
-          border: 1px solid #e4e7ed;
+          border: 1px solid #909399;
           vertical-align: middle;
         }
       }
@@ -969,8 +970,8 @@ const rules = {
 
         .el-radio-group {
           display: flex;
-          flex-direction: column;
-          gap: 8px;
+          flex-direction: row;
+          gap: 20px;
         }
       }
 

+ 48 - 0
src/views/elderly/fee/out-refund/Form.vue

@@ -290,6 +290,54 @@
                 </div>
               </template>
             </el-table-column>
+            <!-- 出院当天超时退费配置 -->
+            <el-table-column label="出院当天退费时间" width="280">
+              <template #default="scope">
+                <div style="display: flex; flex-direction: row; align-items: center; gap: 8px">
+                  <el-switch
+                    v-model="scope.row.isOverTimeRefundStart"
+                    :active-value="1"
+                    :inactive-value="0"
+                    active-text="启用"
+                    inactive-text="禁用"
+                    :disabled="isDetail"
+                  />
+                  <el-time-picker
+                    v-if="scope.row.isOverTimeRefundStart === 1"
+                    v-model="scope.row.overTimeRefundStartTime"
+                    placeholder="选择时间"
+                    format="HH:mm"
+                    value-format="HH:mm"
+                    style="width: 120px"
+                    :disabled="isDetail"
+                  />
+                </div>
+              </template>
+            </el-table-column>
+            <!-- 返院当天超时退费配置 -->
+            <el-table-column label="返院当天退费时间" width="280">
+              <template #default="scope">
+                <div style="display: flex; flex-direction: row; align-items: center; gap: 8px">
+                  <el-switch
+                    v-model="scope.row.isOverTimeRefundEnd"
+                    :active-value="1"
+                    :inactive-value="0"
+                    active-text="启用"
+                    inactive-text="禁用"
+                    :disabled="isDetail"
+                  />
+                  <el-time-picker
+                    v-if="scope.row.isOverTimeRefundEnd === 1"
+                    v-model="scope.row.overTimeRefundEndTime"
+                    placeholder="选择时间"
+                    format="HH:mm"
+                    value-format="HH:mm"
+                    style="width: 120px"
+                    :disabled="isDetail"
+                  />
+                </div>
+              </template>
+            </el-table-column>
           </el-table>
         </div>
       </template>

+ 1 - 7
src/views/social-worker/assessment/AttackRiskFactors/index.vue

@@ -148,17 +148,11 @@
 <script setup lang="ts">
 import AddForm from "./AddForm.vue";
 import ButtonAdd from "@/components/ButtonAdd/src/ButtonAdd.vue";
-import ButtonImport from "@/components/ButtonImport/src/ButtonImport.vue";
 import { useUserStore } from '@/store/modules/user'
-import {formatTimestamp, getCurrentMonthRange} from "@/utils/dateUtil";
+import {getCurrentMonthRange} from "@/utils/dateUtil";
 import Import from "@/components/ImportFile/index.vue";
-import {restraintCreatePage, restraintDelete} from "@/api/elderly/nursing/keep-fit";
 import {
   attackRiskDelete, attackRiskPage,
-  ngasrDelete,
-  ngasrPage,
-  perceptionDelete,
-  perceptionPage
 } from "@/api/social-work";
 const message = useMessage() // 消息弹窗
 const { t } = useI18n() // 国际化

+ 1 - 7
src/views/social-worker/assessment/SAS/index.vue

@@ -148,17 +148,11 @@
 <script setup lang="ts">
 import AddForm from "./AddForm.vue";
 import ButtonAdd from "@/components/ButtonAdd/src/ButtonAdd.vue";
-import ButtonImport from "@/components/ButtonImport/src/ButtonImport.vue";
 import { useUserStore } from '@/store/modules/user'
 import {formatTimestamp, getCurrentMonthRange} from "@/utils/dateUtil";
 import Import from "@/components/ImportFile/index.vue";
-import {restraintCreatePage, restraintDelete} from "@/api/elderly/nursing/keep-fit";
 import {
-  attackRiskDelete, attackRiskPage,
-  ngasrDelete,
-  ngasrPage,
-  perceptionDelete,
-  perceptionPage, sasDelete, sasPage, sdsDelete, sdsPage
+  sasDelete, sasPage
 } from "@/api/social-work";
 const message = useMessage() // 消息弹窗
 const { t } = useI18n() // 国际化

+ 1 - 7
src/views/social-worker/assessment/SDS/index.vue

@@ -148,17 +148,11 @@
 <script setup lang="ts">
 import AddForm from "./AddForm.vue";
 import ButtonAdd from "@/components/ButtonAdd/src/ButtonAdd.vue";
-import ButtonImport from "@/components/ButtonImport/src/ButtonImport.vue";
 import { useUserStore } from '@/store/modules/user'
 import {formatTimestamp, getCurrentMonthRange} from "@/utils/dateUtil";
 import Import from "@/components/ImportFile/index.vue";
-import {restraintCreatePage, restraintDelete} from "@/api/elderly/nursing/keep-fit";
 import {
-  attackRiskDelete, attackRiskPage,
-  ngasrDelete,
-  ngasrPage,
-  perceptionDelete,
-  perceptionPage, sdsDelete, sdsPage
+  sdsDelete, sdsPage
 } from "@/api/social-work";
 const message = useMessage() // 消息弹窗
 const { t } = useI18n() // 国际化