Ver código fonte

分页无效的问题2

chenjun 1 mês atrás
pai
commit
af7939d53b
36 arquivos alterados com 1052 adições e 520 exclusões
  1. BIN
      src/assets/jiufang/antiEntertainment-01.png
  2. BIN
      src/assets/jiufang/antiEntertainment-02.png
  3. BIN
      src/assets/jiufang/antiEntertainment-03.png
  4. BIN
      src/assets/jiufang/asphyxiationByChoking-01.png
  5. BIN
      src/assets/jiufang/asphyxiationByChoking-02.png
  6. BIN
      src/assets/jiufang/asphyxiationByChoking-03.png
  7. BIN
      src/assets/jiufang/assessSimpleMentalState-01.png
  8. BIN
      src/assets/jiufang/assessSimpleMentalState-02.png
  9. BIN
      src/assets/jiufang/assessSimpleMentalState-03.png
  10. BIN
      src/assets/jiufang/commitSuicide-01.png
  11. BIN
      src/assets/jiufang/commitSuicide-02.png
  12. BIN
      src/assets/jiufang/commitSuicide-03.png
  13. BIN
      src/assets/jiufang/empyrosis-01.png
  14. BIN
      src/assets/jiufang/empyrosis-02.png
  15. BIN
      src/assets/jiufang/empyrosis-03.png
  16. BIN
      src/assets/jiufang/fallDown-01.png
  17. BIN
      src/assets/jiufang/fallDown-02.png
  18. BIN
      src/assets/jiufang/fallDown-03.png
  19. BIN
      src/assets/jiufang/fallPreventionMeasures-01.png
  20. BIN
      src/assets/jiufang/fallPreventionMeasures-02.png
  21. BIN
      src/assets/jiufang/fallPreventionMeasures-03.png
  22. BIN
      src/assets/jiufang/pressureSores-01.png
  23. BIN
      src/assets/jiufang/pressureSores-02.png
  24. BIN
      src/assets/jiufang/pressureSores-03.png
  25. BIN
      src/assets/jiufang/wanderAway-01.png
  26. BIN
      src/assets/jiufang/wanderAway-02.png
  27. BIN
      src/assets/jiufang/wanderAway-03.png
  28. 462 345
      src/components/BedCardComponent/index.vue
  29. 28 24
      src/components/BedCardModal/index.vue
  30. 23 5
      src/components/HealthRecordContent/index.vue
  31. 76 19
      src/utils/outBedCard.ts
  32. 0 1
      src/views/elderly/elder/contract/Renewal.vue
  33. 1 1
      src/views/elderly/elder/elder-file/Detail.vue
  34. 440 119
      src/views/elderly/elder/health-record/Form.vue
  35. 20 4
      src/views/elderly/elder/types.ts
  36. 2 2
      src/views/elderly/restaurant/satisfactionSurvey/index.vue

BIN
src/assets/jiufang/antiEntertainment-01.png


BIN
src/assets/jiufang/antiEntertainment-02.png


BIN
src/assets/jiufang/antiEntertainment-03.png


BIN
src/assets/jiufang/asphyxiationByChoking-01.png


BIN
src/assets/jiufang/asphyxiationByChoking-02.png


BIN
src/assets/jiufang/asphyxiationByChoking-03.png


BIN
src/assets/jiufang/assessSimpleMentalState-01.png


BIN
src/assets/jiufang/assessSimpleMentalState-02.png


BIN
src/assets/jiufang/assessSimpleMentalState-03.png


BIN
src/assets/jiufang/commitSuicide-01.png


BIN
src/assets/jiufang/commitSuicide-02.png


BIN
src/assets/jiufang/commitSuicide-03.png


BIN
src/assets/jiufang/empyrosis-01.png


BIN
src/assets/jiufang/empyrosis-02.png


BIN
src/assets/jiufang/empyrosis-03.png


BIN
src/assets/jiufang/fallDown-01.png


BIN
src/assets/jiufang/fallDown-02.png


BIN
src/assets/jiufang/fallDown-03.png


BIN
src/assets/jiufang/fallPreventionMeasures-01.png


BIN
src/assets/jiufang/fallPreventionMeasures-02.png


BIN
src/assets/jiufang/fallPreventionMeasures-03.png


BIN
src/assets/jiufang/pressureSores-01.png


BIN
src/assets/jiufang/pressureSores-02.png


BIN
src/assets/jiufang/pressureSores-03.png


BIN
src/assets/jiufang/wanderAway-01.png


BIN
src/assets/jiufang/wanderAway-02.png


BIN
src/assets/jiufang/wanderAway-03.png


+ 462 - 345
src/components/BedCardComponent/index.vue

@@ -5,349 +5,375 @@
       <!-- 头部信息 -->
       <div class="card-header">
         <h2 class="header-title">床头卡信息</h2>
+        <div class="header-room">{{ patientData.roomName || 'F301-1' }}</div>
         <img src="../../assets/imgs/logo_card.png" alt="颐年医养" class="header-logo" />
       </div>
 
-      <!-- 左侧床号信息 -->
-      <div class="left-section">
-        <div class="room-number">{{ patientData.roomName }}</div>
-        <div class="bed-info">
-          <span class="bed-letter">{{ patientData.bedName }}</span>
-          <span class="bed-text">床</span>
+      <div class="card-main">
+        <!-- 左侧床号信息 -->
+        <div class="left-section">
+          <div class="bed-info">
+            <span class="bed-letter">{{ patientData.bedName || '' }}</span>
+            <span class="bed-text">床</span>
+          </div>
+
+          <!-- 二维码 -->
+          <div class="qrcode-container">
+            <Qrcode :text="qrCodeContent" :width="120" :logo="logoUrl" tag="canvas" />
+            <div class="qrcode-text">长者二维码</div>
+          </div>
         </div>
 
-        <!-- 二维码 -->
-        <div class="qrcode-container">
-          <Qrcode
-            :text="qrCodeContent"
-            :width="120"
-            :logo="logoUrl"
-            tag="canvas"
-          />
-          <div class="qrcode-text">长者二维码</div>
+        <!-- 右侧信息表格 -->
+        <div class="right-section">
+          <table class="info-table">
+            <!-- 基本信息行 -->
+            <tr>
+              <td class="table-label">姓名</td>
+              <td class="table-data">{{ patientData.elderName || '--' }}</td>
+              <td class="table-label">性别</td>
+              <td class="table-data">{{ patientData.elderSex || '--' }}</td>
+              <td class="table-label">生日</td>
+              <td class="table-data">{{ patientData.birthday || '--' }}</td>
+              <td class="table-label">入住时间</td>
+              <td class="table-data">{{ patientData.checkInTime || '--' }}</td>
+            </tr>
+
+            <!-- 护理等级 / 照护要点 / 过敏史 -->
+            <tr>
+              <td class="table-label">护理等级</td>
+              <td class="table-data">{{ patientData.careLevel || '--' }}</td>
+              <td class="table-label">照护要点</td>
+              <td class="table-data" colspan="3">{{ patientData.carePoints || '--' }}</td>
+              <td class="table-label">过敏史</td>
+              <td class="table-data">{{ patientData.allergiesText || '--' }}</td>
+            </tr>
+
+            <!-- 既往病史 / 用药史 -->
+            <tr>
+              <td class="table-label">既往病史</td>
+              <td class="table-data" colspan="3">{{ patientData.medicalHistory || '--' }}</td>
+              <td class="table-label">用药史</td>
+              <td class="table-data" colspan="3">{{ patientData.medicationHistory || '--' }}</td>
+            </tr>
+
+            <!-- 饮食要点 -->
+            <tr>
+              <td class="table-label">饮食要点</td>
+              <td class="table-data diet-cell" colspan="7">
+                <div v-if="hasDietGuidelines" class="diet-list">
+                  <div
+                    v-for="item in dietTypes"
+                    :key="item.value"
+                    class="diet-item"
+                    :class="{ active: isDietActive(item.label) }"
+                  >
+                    <span v-if="isDietActive(item.label)" class="diet-check">√</span>
+                    <span class="diet-name">{{ item.label }}</span>
+                  </div>
+                </div>
+                <div v-else class="diet-empty">--</div>
+              </td>
+            </tr>
+
+            <!-- 九防注意事项 -->
+            <tr>
+              <td class="table-label prevention-title">
+                <div class="vertical-text">九防注意事项</div>
+              </td>
+              <td class="table-data prevention-cell" colspan="7">
+                <div class="prevention-grid">
+                  <div
+                    v-for="(item, index) in preventionItems"
+                    :key="item.key"
+                    class="prevention-item"
+                    :class="[`prevention-pos-${index + 1}`]"
+                  >
+                    <!-- <div class="risk-badge" v-if="patientData[item.field]">
+                      <span class="risk-star">★</span>
+                      <span class="risk-text">{{ getRiskText(patientData[item.field]) }}</span>
+                    </div> -->
+                    <img
+                      v-if="patientData[item.field]"
+                      :src="getPreventionImage(item.field, patientData[item.field])"
+                      :alt="item.name"
+                      class="placeholder-image"
+                    />
+                    <div v-else class="prevention-image placeholder-image">
+                      <span>{{ item.name }}</span>
+                    </div>
+                    <!--          <div class="prevention-name">{{ item.name }}</div>-->
+                  </div>
+                </div>
+              </td>
+            </tr>
+
+            <!-- 责任人员 -->
+            <tr>
+              <td class="table-label">责任护理员</td>
+              <td class="table-data" colspan="2">{{
+                patientData.responsibleStaff?.nurseAide || '--'
+              }}</td>
+              <td class="table-label">责任护士</td>
+              <td class="table-data" colspan="2">{{
+                patientData.responsibleStaff?.nurse || '--'
+              }}</td>
+              <td class="table-label">主管医生</td>
+              <td class="table-data">{{ patientData.responsibleStaff?.doctor || '--' }}</td>
+            </tr>
+          </table>
         </div>
       </div>
 
-      <!-- 右侧信息表格 -->
-      <div class="right-section">
-        <table class="info-table">
-          <!-- 基本信息行 -->
-          <tr>
-            <td class="table-label" style="border-top: 1px solid #000;border-left: 1px solid #000;">姓名</td>
-            <td class="table-data" style="border-top: 1px solid #000;">{{ patientData.elderName || '--' }}</td>
-            <td class="table-label" style="border-top: 1px solid #000;">性别</td>
-            <td class="table-data" style="border-top: 1px solid #000;">{{ patientData.elderSex || '--' }}</td>
-            <td class="table-label" style="border-top: 1px solid #000;">生日</td>
-            <td class="table-data" style="border-top: 1px solid #000;">{{ patientData.birthday || '--' }}</td>
-            <td class="table-label" style="border-top: 1px solid #000;">入住时间</td>
-            <td class="table-data" style="border-top: 1px solid #000;">{{ patientData.checkInTime || '--' }}</td>
-          </tr>
-
-          <!-- 护理信息行 -->
-          <tr>
-            <td class="table-label" style="border-left: 1px solid #000;">护理等级</td>
-            <td class="table-data">{{ patientData.careLevel || '--' }}</td>
-            <td class="table-label">血型</td>
-            <td class="table-data" colspan="5">{{ patientData.bloodTypeText || '--' }}</td>
-
-          </tr>
-          <tr>
-            <td class="table-label" style="border-left: 1px solid #000;">药物过敏</td>
-            <td class="table-data" colspan="7">{{ patientData.drugAllergyHistoryText || '--' }}</td>
-          </tr>
-          <tr>
-            <td class="table-label" style="border-left: 1px solid #000;">食物过敏</td>
-            <td class="table-data" colspan="7">{{ patientData.historyFoodAllergiesText || '--' }}</td>
-          </tr>
-          <!-- 病史信息行 -->
-          <tr>
-            <td class="table-label" style="border-left: 1px solid #000;">既往病史</td>
-            <td class="table-data" colspan="7">{{ patientData.medicalHistory || '--' }}</td>
-          </tr>
-
-          <!-- 饮食要点标题行 -->
-          <tr>
-            <td class="section-title"  style="border-left: 1px solid #000;">饮食要点</td>
-            <td class="table-data" colspan="7">{{ patientData.diet?.normal || '--' }}</td>
-          </tr>
-
-          <!-- 饮食类型行 -->
-<!--          <tr>-->
-<!--            <td class="diet-type" colspan="8" style="padding: 0;">-->
-<!--              <div class="diet-container">-->
-<!--                <div class="diet-item" style="border-left: 1px solid #000;">普 食</div>-->
-<!--                <div class="diet-item">软 食</div>-->
-<!--                <div class="diet-item">半流质</div>-->
-<!--                <div class="diet-item">流 质</div>-->
-<!--                <div class="diet-item">鼻 饲</div>-->
-<!--              </div>-->
-<!--            </td>-->
-<!--          </tr>-->
-
-          <!-- 饮食详情行 -->
-<!--          <tr>-->
-<!--            <td class="table-data" colspan="8" style="padding: 0;">-->
-<!--              <div class="diet-container">-->
-<!--                <div class="diet-item" style="border-left: 1px solid #000;">{{ patientData.diet?.normal || '152467' }}</div>-->
-<!--                <div class="diet-item">{{ patientData.diet?.soft || '152467' }}</div>-->
-<!--                <div class="diet-item">{{ patientData.diet?.semiLiquid || '152467' }}</div>-->
-<!--                <div class="diet-item">{{ patientData.diet?.liquid || '152467' }}</div>-->
-<!--                <div class="diet-item">{{ patientData.diet?.nasogastric || '152467' }}</div>-->
-<!--              </div>-->
-<!--            </td>-->
-<!--          </tr>-->
-
-          <!-- 责任人员行 -->
-<!--          <tr>-->
-<!--            <td class="table-data" colspan="8" style="padding: 0;">-->
-<!--              <div class="staff-container">-->
-<!--                <div class="staff-label" style="border-left: 1px solid #000;">-->
-<!--                  <div style="line-height: 1.2;">责任</div>-->
-<!--                  <div style="line-height: 1.2;">护理员</div>-->
-<!--                </div>-->
-<!--                <div class="staff-value">{{ patientData.responsibleStaff?.nurseAide || '152467' }}</div>-->
-<!--                <div class="staff-label">-->
-<!--                  <div style="line-height: 1.2;">责任</div>-->
-<!--                  <div style="line-height: 1.2;">护士</div>-->
-<!--                </div>-->
-<!--                <div class="staff-value">{{ patientData.responsibleStaff?.nurse || '152467' }}</div>-->
-<!--                <div class="staff-label">-->
-<!--                  <div style="line-height: 1.2;">主管</div>-->
-<!--                  <div style="line-height: 1.2;">医生</div>-->
-<!--                </div>-->
-<!--                <div class="staff-value">{{ patientData.responsibleStaff?.doctor || '152467' }}</div>-->
-<!--              </div>-->
-<!--            </td>-->
-<!--          </tr>-->
-        </table>
-      </div>
-
       <!-- 底部装饰条 -->
-      <div class="card-footer">
-        <img src="../../assets/imgs/card_bottom.png" alt="颐年医养" style="width: 100%;" />
-
-      </div>
+      <div class="card-footer"></div>
     </div>
-
   </div>
 </template>
 
 <script setup lang="ts">
-import { ref, reactive, onMounted } from 'vue';
+import { ref, reactive, onMounted, computed } from 'vue'
 
 // 定义全局window接口扩展
 declare global {
   interface Window {
-    __GlobalZipManager?: any;
+    __GlobalZipManager?: any
   }
 }
-import { ElMessage } from 'element-plus';
-import html2canvas from 'html2canvas';
-import { Qrcode } from '@/components/Qrcode';
-import JSZip from 'jszip';
+import { ElMessage } from 'element-plus'
+import html2canvas from 'html2canvas'
+import { Qrcode } from '@/components/Qrcode'
+import JSZip from 'jszip'
 // Props定义
 const props = defineProps<{
-  roomNumber?: string;
-  bedLetter?: string;
-  showLogo?: boolean;
-  qrcodeUrl?: string;
-}>();
+  roomNumber?: string
+  bedLetter?: string
+  showLogo?: boolean
+  qrcodeUrl?: string
+}>()
 
 // 默认值
-const qrCodeContent = ref('');
-//const logoUrl = ref('@/assets/imgs/logo.png');
-const logoUrl = ref('/logo.png');
+const qrCodeContent = ref('')
+const logoUrl = ref('/logo.png')
+
+// 饮食类型
+const dietTypes = [
+  { value: '1', label: '普食' },
+  { value: '2', label: '软食' },
+  { value: '3', label: '半流质' },
+  { value: '4', label: '流质' },
+  { value: '5', label: '鼻饲' }
+]
+
+// 九防项目配置
+const preventionItems = [
+  { key: 'asphyxiation', name: '防噎食', field: 'asphyxiationByChoking' },
+  { key: 'pressureSores', name: '防压疮', field: 'pressureSores' },
+  { key: 'bedFall', name: '防坠床', field: 'fallPreventionMeasures' },
+  { key: 'selfHarm', name: '防他伤和自伤', field: 'commitSuicide' },
+  { key: 'foodDrug', name: '防误食', field: 'assessSimpleMentalState' },
+  { key: 'scald', name: '防烫伤', field: 'empyrosis' },
+  { key: 'fall', name: '防跌倒', field: 'fallDown' },
+  { key: 'wandering', name: '防走失', field: 'wanderAway' },
+  { key: 'entertainment', name: '防文娱活动意外', field: 'antiEntertainment' }
+]
+
+// 判断饮食类型是否激活
+const hasDietGuidelines = computed(() => {
+  return !!(patientData.dietaryGuidelines && patientData.dietaryGuidelines.trim())
+})
+
+const isDietActive = (label: string) => {
+  const value = patientData.dietaryGuidelines
+  // 1. 如果是空值,直接返回 false
+  if (!value) return false
+
+  // 2. 如果是字符串(例如 '半流质'),直接做全等判断
+  if (typeof value === 'string') {
+    return value === label
+  }
+
+  return false
+}
+
+// 风险等级文本
+const getRiskText = (value: string) => {
+  const map: Record<string, string> = {
+    high: '高风险',
+    medium: '中风险',
+    low: '低风险',
+    none: '无风险'
+  }
+  return map[value] || value || ''
+}
+
+// 根据风险等级获取九防图片地址
+const getPreventionImage = (field: string, level: string) => {
+  const levelMap: Record<string, string> = {
+    low: '01',
+    medium: '02',
+    high: '03'
+  }
+  const suffix = levelMap[level] || '01'
+  return new URL(`../../assets/jiufang/${field}-${suffix}.png`, import.meta.url).href
+}
+
 // 患者数据
 const patientData = reactive({
-  roomName:'',
-  bedName:'',
+  roomName: '',
+  bedName: '',
   elderName: '',
   elderSex: '',
   birthday: '',
   checkInTime: '',
   careLevel: '',
   carePoints: '',
-  drugAllergyHistoryText: '',
-  historyFoodAllergiesText: '',
-  bloodTypeText: '',
+  allergiesText: '',
   medicalHistory: '',
   medicationHistory: '',
-  diet: {
-    normal: '',
-    soft: '',
-    semiLiquid: '',
-    liquid: '',
-    nasogastric: ''
-  },
+  dietaryGuidelines: '',
   responsibleStaff: {
     nurseAide: '',
     nurse: '',
     doctor: ''
   },
-  qr:{
-    eId:'',
-    tId:''
+  asphyxiationByChoking: '',
+  pressureSores: '',
+  fallPreventionMeasures: '',
+  assessSimpleMentalState: '',
+  empyrosis: '',
+  fallDown: '',
+  wanderAway: '',
+  antiEntertainment: '',
+  commitSuicide: '',
+  qr: {
+    eId: '',
+    tId: ''
   }
-});
+})
 
 // 使用全局变量方式实现真正的全局单例管理
-// 检查全局window对象是否已经有了ZipManager实例
 if (!(window as any).__GlobalZipManager) {
-  // 定义全局单例管理器
-  (window as any).__GlobalZipManager = {
+  ;(window as any).__GlobalZipManager = {
     instance: null as JSZip | null,
     count: 0,
 
-    getZip: function(): JSZip {
+    getZip: function (): JSZip {
       if (!this.instance) {
-        this.instance = new JSZip();
-        this.count = 0;
-        console.log('创建了新的全局JSZip单例实例');
+        this.instance = new JSZip()
+        this.count = 0
+        console.log('创建了新的全局JSZip单例实例')
       }
-      return this.instance;
+      return this.instance
     },
 
-    incrementCount: function(): void {
-      this.count++;
+    incrementCount: function (): void {
+      this.count++
     },
 
-    getCount: function(): number {
-      return this.count;
+    getCount: function (): number {
+      return this.count
     },
 
-    reset: function(): void {
-      this.instance = null;
-      this.count = 0;
-      console.log('已重置全局JSZip单例实例');
+    reset: function (): void {
+      this.instance = null
+      this.count = 0
+      console.log('已重置全局JSZip单例实例')
     },
 
-    // 获取当前文件列表
-    getFileList: function(): string[] {
-      if (!this.instance) return [];
-      return Object.keys(this.instance.files);
+    getFileList: function (): string[] {
+      if (!this.instance) return []
+      return Object.keys(this.instance.files)
     }
-  };
+  }
 }
 
-// 获取全局单例管理器
-const GlobalZipManager = (window as any).__GlobalZipManager;
-
-// 使用ref记录已添加的文件数量(仅用于UI显示,如果需要)
-const fileCount = ref(0);
-
-
-onMounted(()=>{
+const GlobalZipManager = (window as any).__GlobalZipManager
+const fileCount = ref(0)
 
-
-})
+onMounted(() => {})
 
 // 导出床头卡
 const exportAsImage = async (type: number) => {
-    try {
-      // 获取要截图的元素
-      const element = document.querySelector('.bed-card');
-      if (!element) return;
-
-      // 生成 canvas
-      const canvas = await html2canvas(element as HTMLElement, {
-        scale: 2, // 提高清晰度
-        useCORS: true, // 支持跨域图片
-        backgroundColor: '#ffffff',
-        logging: false, // 关闭日志
-        allowTaint: true, // 允许跨域图片
-        foreignObjectRendering: false, // 禁用外部对象渲染,避免边框问题
-        imageTimeout: 0, // 图片加载超时时间
-        removeContainer: true, // 清理临时容器
-        scrollX: 0,
-        scrollY: 0,
-        width: element.scrollWidth,
-        height: element.scrollHeight
-      });
-
-      // 获取文件名
-      const fileName = `${patientData.elderName}${patientData.bedName}床头卡.png`;
-
-      // 将canvas转换为base64
-      const imageBase64 = canvas.toDataURL('image/png', 1.0);
-
-      // 提取base64数据部分(去除data:image/png;base64,前缀)
-      const base64Data = imageBase64.split(',')[1];
-
-      if (type === 2) {
-        // 类型为2时,添加到临时zip文件
-        const zipInstance = GlobalZipManager.getZip();
-        zipInstance.file(fileName, base64Data, { base64: true });
-        GlobalZipManager.incrementCount();
-        fileCount.value = GlobalZipManager.getCount();
-        // 获取并显示当前压缩包中的文件列表
-        //const fileNames = GlobalZipManager.getFileList();
-       // console.log(`已添加${fileName}到临时压缩包,当前共${GlobalZipManager.getCount()}个文件,文件列表:${fileNames.join(', ')}`);
-      } else if (type === 3) {
-        // 类型为3时,添加文件并下载压缩包
-        // 即使只有一个文件(第一次调用就是type=3),也要正常工作
-        const zipInstance = GlobalZipManager.getZip();
-        zipInstance.file(fileName, base64Data, { base64: true });
-        GlobalZipManager.incrementCount();
-        fileCount.value = GlobalZipManager.getCount();
-        // 获取并显示当前压缩包中的文件列表
-        const fileNames = GlobalZipManager.getFileList();
-       // console.log(`添加最后一个文件${fileName}到压缩包,压缩包中共有${fileNames.length}个文件,文件列表:${fileNames.join(', ')}`);
-
-      // 生成压缩包
-      const content = await zipInstance.generateAsync({ type: 'blob' });
-      //console.log(`压缩包生成完成,大小:${(content.size / 1024).toFixed(2)}KB`);
-
-      // 创建下载链接
-      const link = document.createElement('a');
-      link.href = URL.createObjectURL(content);
-      link.download = `床头卡压缩包_${new Date().getTime()}.zip`;
-      link.click();
-
-      // 清理临时数据
-      GlobalZipManager.reset();
-      fileCount.value = 0;
-
-      ElMessage.success(`床头卡压缩包导出成功,共包含${fileNames.length}个文件`);
+  try {
+    const element = document.querySelector('.bed-card')
+    if (!element) return
+
+    const canvas = await html2canvas(element as HTMLElement, {
+      scale: 2,
+      useCORS: true,
+      backgroundColor: '#ffffff',
+      logging: false,
+      allowTaint: true,
+      foreignObjectRendering: false,
+      imageTimeout: 0,
+      removeContainer: true,
+      scrollX: 0,
+      scrollY: 0,
+      width: element.scrollWidth,
+      height: element.scrollHeight
+    })
+
+    const fileName = `${patientData.elderName}${patientData.bedName}床头卡.png`
+    const imageBase64 = canvas.toDataURL('image/png', 1.0)
+    const base64Data = imageBase64.split(',')[1]
+
+    if (type === 2) {
+      const zipInstance = GlobalZipManager.getZip()
+      zipInstance.file(fileName, base64Data, { base64: true })
+      GlobalZipManager.incrementCount()
+      fileCount.value = GlobalZipManager.getCount()
+    } else if (type === 3) {
+      const zipInstance = GlobalZipManager.getZip()
+      zipInstance.file(fileName, base64Data, { base64: true })
+      GlobalZipManager.incrementCount()
+      fileCount.value = GlobalZipManager.getCount()
+      const fileNames = GlobalZipManager.getFileList()
+      const content = await zipInstance.generateAsync({ type: 'blob' })
+      const link = document.createElement('a')
+      link.href = URL.createObjectURL(content)
+      link.download = `床头卡压缩包_${new Date().getTime()}.zip`
+      link.click()
+      GlobalZipManager.reset()
+      fileCount.value = 0
+      ElMessage.success(`床头卡压缩包导出成功,共包含${fileNames.length}个文件`)
     } else {
-      // 其他类型,直接下载单个文件
-      const link = document.createElement('a');
-      link.href = imageBase64;
-      link.download = fileName;
-      link.click();
-
-      ElMessage.success('床头卡导出成功');
+      const link = document.createElement('a')
+      link.href = imageBase64
+      link.download = fileName
+      link.click()
+      ElMessage.success('床头卡导出成功')
     }
   } catch (error) {
-      console.error('导出失败:', error);
-      ElMessage.error('导出失败,请稍后重试');
-      // 出错时清理临时数据
-      if (type === 2 || type === 3) {
-        GlobalZipManager.reset();
-        fileCount.value = 0;
-      }
+    console.error('导出失败:', error)
+    ElMessage.error('导出失败,请稍后重试')
+    if (type === 2 || type === 3) {
+      GlobalZipManager.reset()
+      fileCount.value = 0
+    }
   }
-};
+}
 
 // 更新患者数据的方法
 const updatePatientData = (data: any) => {
-  qrCodeContent.value = 'https://callback.ynims.com/qrcode/elderlyId?=' + data.qr?.eId + '&tenantId=' + data.qr?.tId
-  Object.assign(patientData, data);
+  qrCodeContent.value =
+    'https://callback.ynims.com/qrcode/elderlyId?=' + data.qr?.eId + '&tenantId=' + data.qr?.tId
+  Object.assign(patientData, data)
 }
 
 // 重置临时zip数据
 const resetTempZip = () => {
-  GlobalZipManager.reset();
-  fileCount.value = 0;
-  console.log('已重置临时zip数据');
-};
-
+  GlobalZipManager.reset()
+  fileCount.value = 0
+  console.log('已重置临时zip数据')
+}
 
 // 暴露方法给父组件
 defineExpose({
   updatePatientData,
   exportAsImage,
   resetTempZip
-});
+})
 </script>
 
 <style scoped>
@@ -355,11 +381,11 @@ defineExpose({
   display: flex;
   flex-direction: column;
   align-items: center;
-  padding: 20px;
+  padding: 12px;
 }
 
 .bed-card {
-  min-width: 850px;
+  min-width: 900px;
   background-color: white;
   border: 1px solid #e0e0e0;
   box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
@@ -368,9 +394,9 @@ defineExpose({
 }
 
 .card-header {
-  background-color: #4CAF50;
+  background-color: #e78d35;
   color: white;
-  padding: 15px 20px;
+  padding: 8px 20px;
   display: flex;
   justify-content: space-between;
   align-items: center;
@@ -380,32 +406,50 @@ defineExpose({
   margin: 0;
   font-size: 20px;
   font-weight: bold;
+  flex: 1;
+}
+
+.header-room {
+  font-size: 28px;
+  font-weight: bold;
+  text-align: center;
+  flex: 1;
 }
 
 .header-logo {
-  height: 30px;
+  height: 60px;
+  flex: 1;
+  text-align: right;
+  object-fit: contain;
+}
+
+.card-main {
+  display: flex;
+  min-height: 480px;
 }
 
 .left-section {
-  width: 200px;
-  float: left;
-  padding: 10px 6px;
+  width: 150px;
+  padding: 20px 10px;
   text-align: center;
   border-right: 1px solid #e0e0e0;
+  display: flex;
+  flex-direction: column;
+  align-items: center;
 }
 
 .room-number {
   font-size: 60px;
   font-weight: bold;
-  color: #FF6B00;
+  color: #ff6b00;
   margin-bottom: 10px;
 }
 
 .bed-info {
   font-size: 36px;
   font-weight: bold;
-  color: #FF6B00;
-  margin-bottom: 10px;
+  color: #ff6b00;
+  margin-bottom: 20px;
 }
 
 .bed-letter {
@@ -416,70 +460,49 @@ defineExpose({
   margin-top: 10px;
 }
 
-.qrcode {
-  width: 100px;
-  height: 100px;
-  border: 1px solid #e0e0e0;
-}
-
 .qrcode-text {
-  margin-top: 2px;
+  margin-top: 8px;
   font-size: 14px;
   color: #666;
 }
 
 .right-section {
-  overflow: hidden;
-  padding: 20px;
+  flex: 1;
+  padding: 0;
 }
 
 .info-table {
   width: 100%;
-  border-collapse: separate;
+  border-collapse: collapse;
   font-size: 14px;
-  border-spacing: 0;
+  height: 100%;
 }
 
 .info-table td {
-  border-right: 1px solid #000;
-  border-bottom: 1px solid #000;
+  border: 1px solid #999;
   padding: 10px;
   text-align: center;
-}
-
-.info-table .no-right-border {
-  border-right: none;
-}
-
-.info-table .no-bottom-border {
-  border-bottom: none;
+  vertical-align: middle;
 }
 
 .table-label {
   font-weight: bold;
   background-color: #f5f5f5;
-  text-align: right;
+  width: 80px;
+  white-space: nowrap;
 }
 
 .table-data {
   text-align: left;
+  color: #333;
 }
 
-.section-title {
-  background-color: #e8e8e8;
-  font-weight: bold;
-  font-size: 16px;
-  text-align: center;
+.diet-cell {
+  padding: 0 !important;
 }
 
-.diet-type {
-  background-color: #f0f0f0;
-  font-weight: bold;
-}
-
-.diet-container {
+.diet-list {
   display: flex;
-  width: 100%;
   height: 100%;
 }
 
@@ -489,76 +512,170 @@ defineExpose({
   align-items: center;
   justify-content: center;
   padding: 10px;
+  border-right: 1px solid #999;
   position: relative;
+  min-height: 44px;
 }
 
-.diet-item:not(:last-child)::after {
-  content: '';
-  position: absolute;
-  right: 0;
-  top: 0;
-  height: 100%;
-  width: 1px;
-  background-color: #000;
+.diet-item:last-child {
+  border-right: none;
+}
+
+.diet-item.active {
+  background-color: #ffffff;
+  color: #ff6b00;
+}
+
+.diet-name {
+  font-size: 14px;
+}
+
+.diet-check {
+  margin-right: 6px;
+  color: #e78d35;
+  font-weight: bold;
+  font-size: 16px;
 }
 
-.staff-container {
+.diet-empty {
+  padding: 10px;
+  color: #999;
+  text-align: left;
+  min-height: 44px;
   display: flex;
-  width: 100%;
+  align-items: center;
+}
+
+.prevention-title {
+  width: 40px;
+  padding: 0 !important;
+}
+
+.vertical-text {
+  writing-mode: vertical-rl;
+  text-orientation: upright;
+  letter-spacing: 4px;
+  font-size: 16px;
+  font-weight: bold;
+  margin: 0 auto;
+}
+
+.prevention-cell {
+  padding: 0 !important;
+}
+
+.prevention-grid {
+  display: grid;
+  grid-template-columns: repeat(5, 1fr);
+  grid-template-rows: repeat(2, 1fr);
   height: 100%;
+  min-height: 180px;
 }
 
-.staff-label {
-  flex: 1;
+.prevention-item {
+  border-right: 1px solid #999;
+  border-bottom: 1px solid #999;
   display: flex;
   flex-direction: column;
   align-items: center;
   justify-content: center;
-  padding: 8px;
-  font-weight: bold;
-  background-color: #f5f5f5;
+  padding: 6px;
   position: relative;
 }
 
-.staff-label:not(:last-child)::after {
-  content: '';
+.prevention-item:nth-child(9) {
+  border-right: none;
+  border-bottom: none;
+}
+
+.prevention-item:nth-child(n + 6):nth-child(-n + 8) {
+  border-bottom: none;
+}
+
+.prevention-pos-1 {
+  grid-column: 1;
+  grid-row: 1;
+}
+.prevention-pos-2 {
+  grid-column: 2;
+  grid-row: 1;
+}
+.prevention-pos-3 {
+  grid-column: 3;
+  grid-row: 1;
+}
+.prevention-pos-4 {
+  grid-column: 4;
+  grid-row: 1;
+}
+.prevention-pos-5 {
+  grid-column: 1;
+  grid-row: 2;
+}
+.prevention-pos-6 {
+  grid-column: 2;
+  grid-row: 2;
+}
+.prevention-pos-7 {
+  grid-column: 3;
+  grid-row: 2;
+}
+.prevention-pos-8 {
+  grid-column: 4;
+  grid-row: 2;
+}
+.prevention-pos-9 {
+  grid-column: 5;
+  grid-row: 1 / 3;
+  background-color: #fff;
+}
+
+.risk-badge {
   position: absolute;
-  right: 0;
-  top: 0;
-  height: 100%;
-  width: 1px;
-  background-color: #000;
+  top: 4px;
+  left: 4px;
+  display: flex;
+  align-items: center;
+  font-size: 11px;
+  color: #e78d35;
+  font-weight: bold;
+}
+
+.risk-star {
+  margin-right: 2px;
 }
 
-.staff-value {
-  flex: 2;
+.placeholder-image {
+  width: 90px;
+  object-fit: contain;
   display: flex;
   align-items: center;
   justify-content: center;
-  padding: 8px;
-  position: relative;
 }
 
-.staff-value:not(:last-child)::after {
-  content: '';
-  position: absolute;
-  right: 0;
-  top: 0;
-  height: 100%;
-  width: 1px;
-  background-color: #000;
+.placeholder-image span {
+  font-size: 11px;
+  color: #999;
+  text-align: center;
+}
+
+.prevention-name {
+  font-size: 12px;
+  color: #333;
+  text-align: center;
+  line-height: 1.2;
 }
 
 .card-footer {
-  height: 30px;
-  background: linear-gradient(45deg, #FF6B00 0%, #4CAF50 100%);
+  height: 8px;
+  background: linear-gradient(90deg, #e78d35 0%, #4caf50 100%);
   clear: both;
 }
 
 .export-btn {
   margin-top: 20px;
   padding: 10px 30px;
-  background-color: #4CAF50;
+  background-color: #4caf50;
   color: white;
   border: none;
   border-radius: 4px;

+ 28 - 24
src/components/BedCardModal/index.vue

@@ -91,11 +91,13 @@ watch(visible, (newVal) => {
 // 更新患者数据
 const updatePatientData = async (data) => {
   await nextTick()
-  if (bedCardRef.value && typeof bedCardRef.value.updatePatientData === 'function' && props.patientData) {
+  // 优先使用传入的数据,否则回退到 props.patientData
+  const sourceData = data && Object.keys(data).length > 0 ? data : props.patientData
+  if (bedCardRef.value && typeof bedCardRef.value.updatePatientData === 'function' && sourceData) {
     // 处理床位信息
     let beStr = ['','']
     try {
-      const bdList = props.patientData.bedName?.toString().split('-')
+      const bdList = sourceData.bedName?.toString().split('-')
       beStr[0] = bdList[bdList?.length-2] || ''
       beStr[1] = bdList[bdList?.length-1] || ''
     } catch (e) {
@@ -105,35 +107,37 @@ const updatePatientData = async (data) => {
     const patientData = {
       roomName: beStr[0],
       bedName: beStr[1],
-      elderName: props.patientData.elderName || '--',
-      elderSex: props.patientData.elderSex?.toString() === '1' ? '男' : '女',
-      birthday: props.patientData.birthday ? formatDate(props.patientData.birthday, 'YYYY-MM-DD') : '--',
-      checkInTime: props.patientData.checkInTime ? formatTime(props.patientData.checkInTime, 'yyyy-MM-dd') : '--',
-      careLevel: props.patientData.nurseLevelName || '--',
-      carePoints: '',
-      historyFoodAllergiesText: '',
-      drugAllergyHistoryText: '',
-      medicalHistory: '',
-      medicationHistory: '',
-      diet: {
-        normal: '',
-        soft: '',
-        semiLiquid: '',
-        liquid: '',
-        nasogastric: ''
-      },
-      responsibleStaff: {
+      elderName: sourceData.elderName || '--',
+      elderSex: sourceData.elderSex?.toString() === '1' ? '男' : '女',
+      birthday: sourceData.birthday ? formatDate(sourceData.birthday, 'YYYY-MM-DD') : '--',
+      checkInTime: sourceData.checkInTime ? formatTime(sourceData.checkInTime, 'yyyy-MM-DD') : '--',
+      careLevel: sourceData.nurseLevelName || sourceData.careLevel || '--',
+      carePoints: sourceData.carePoints || '',
+      allergiesText: sourceData.allergiesText || '--',
+      medicalHistory: sourceData.medicalHistory || '--',
+      medicationHistory: sourceData.medicationHistory || '--',
+      dietaryGuidelines: sourceData.dietaryGuidelines || '',
+      responsibleStaff: sourceData.responsibleStaff || {
         nurseAide: '',
         nurse: '',
         doctor: ''
       },
+      asphyxiationByChoking: sourceData.asphyxiationByChoking || '',
+      pressureSores: sourceData.pressureSores || '',
+      fallPreventionMeasures: sourceData.fallPreventionMeasures || '',
+      assessSimpleMentalState: sourceData.assessSimpleMentalState || '',
+      empyrosis: sourceData.empyrosis || '',
+      fallDown: sourceData.fallDown || '',
+      wanderAway: sourceData.wanderAway || '',
+      antiEntertainment: sourceData.antiEntertainment || '',
+      commitSuicide: sourceData.commitSuicide || '',
       qr: {
-        eId: props.patientData.id || '',
-        tId: props.patientData.tenantId || ''
+        eId: sourceData.id || sourceData.qr?.eId || '',
+        tId: sourceData.tenantId || sourceData.qr?.tId || ''
       }
     };
 
-    bedCardRef.value.updatePatientData(data)
+    bedCardRef.value.updatePatientData(patientData)
   }
 }
 
@@ -154,7 +158,7 @@ const formatDate = (date, format) => {
       .replace('YYYY', year)
       .replace('yyyy', year)
       .replace('MM', month)
-      .replace('dd', day)
+      .replace('DD', day)
   }catch (_){}
   return '--'
 }

+ 23 - 5
src/components/HealthRecordContent/index.vue

@@ -979,15 +979,33 @@ const str2arr = (str) => {
   let arr: string[] = []
   let inputStr: string = ''
   if (str) {
-    arr = JSON.parse(str)
-    if (str.includes('0-')) {
+    if (Array.isArray(str)) {
+      arr = str.map((item) => String(item))
+    } else if (typeof str === 'string') {
+      // 尝试按 JSON 数组解析
+      try {
+        const parsed = JSON.parse(str)
+        if (Array.isArray(parsed)) {
+          arr = parsed.map((item) => String(item))
+        } else {
+          // 普通字符串,按逗号分隔
+          arr = str.split(/[,,]/).map((s) => s.trim()).filter(Boolean)
+        }
+      } catch (e) {
+        // 普通字符串,按逗号分隔
+        arr = str.split(/[,,]/).map((s) => s.trim()).filter(Boolean)
+      }
+    }
+    if (arr.some((item) => item.includes('0-'))) {
       let index = -1
       arr.map((item: string, i) => {
         if (item.indexOf('0-') > -1) index = i
       })
-      let temp = arr.splice(index, 1)
-      arr.push('0')
-      inputStr = temp.join().split('-')[1]
+      if (index > -1) {
+        let temp = arr.splice(index, 1)
+        arr.push('0')
+        inputStr = temp.join().split('-')[1]
+      }
     }
   }
   return {

+ 76 - 19
src/utils/outBedCard.ts

@@ -43,7 +43,7 @@ export const importCard = async (healthRecord,dataElder,type=1) => {
   const patientData = ref({})
   // 使用封装的方法获取床头卡数据
   patientData.value = getPatientData(healthRecord||{},dataElder);
-  //console.log("药物过敏:",patientData.value)
+  console.log("导出床头卡组装数据:",patientData.value)
 
   // 创建临时容器
   const tempContainer = document.createElement('div');
@@ -55,7 +55,7 @@ export const importCard = async (healthRecord,dataElder,type=1) => {
   // 创建Vue应用实例挂载组件
   const { createApp } = await import('vue');
   const app = createApp(component, {
-    patientData: dataForm.value
+    patientData: patientData.value
   });
 
   // 挂载组件
@@ -92,13 +92,16 @@ const dataForm = ref({})
 // 封装床头卡数据的方法
 export const getPatientData = (data,dataElder) => {
   try {
+    console.log('床头卡原始健康档案数据:', data)
+    console.log('床头卡原始长者详情数据:', dataElder)
     dataForm.value = dataElder
     // 获取床位信息
-    const beStr = ['','']
+    const beStr = ['', '']
     try {
       const bdList = dataForm.value.bedName?.toString().split('-')
-      beStr[0] = bdList[bdList?.length-2]
-      beStr[1] = bdList[bdList?.length-1]
+      beStr[1] = bdList[bdList?.length - 1]?.replace(/床$/, '')
+      beStr[0] = bdList[bdList?.length - 2] +' - ' + beStr[1]
+
     } catch (e) {}
 
     // 解析Flag字段为中文
@@ -137,7 +140,7 @@ export const getPatientData = (data,dataElder) => {
       nasogastric: ''
     }
     // 根据healthData.dietetic设置饮食类型
-    switch (parsedFlagData.dietetic) {
+    switch (String(parsedFlagData.dietetic)) {
       case '1':
         diet.normal = '正常饮食'
         break
@@ -155,34 +158,58 @@ export const getPatientData = (data,dataElder) => {
         break
     }
 
-    return {
+    // 合并过敏史
+    const allergies: string[] = []
+    if (parsedFlagData.drugAllergyHistoryText && parsedFlagData.drugAllergyHistoryText !== '--') {
+      allergies.push(parsedFlagData.drugAllergyHistoryText)
+    }
+    if (parsedFlagData.historyFoodAllergiesText && parsedFlagData.historyFoodAllergiesText !== '--') {
+      allergies.push(parsedFlagData.historyFoodAllergiesText)
+    }
+
+    // 组装最终数据
+    const result = {
       roomName: beStr[0],
       bedName: beStr[1],
       elderName: dataForm.value.elderName,
-      elderSex: dataForm.value.elderSex?.toString()=='1'?'男':'女',
+      elderSex: dataForm.value.elderSex?.toString() == '1' ? '男' : '女',
       birthday: formatDate(dataForm.value.birthday, 'YYYY-MM-DD'),
       checkInTime: dataForm.value.checkInTime ? formatTime(dataForm.value.checkInTime, 'yyyy-MM-dd') : '--',
       careLevel: dataForm.value.nurseLevelName,
-      carePoints: parsedFlagData.specialCareNotes || '',
+      carePoints: data?.careNote || '',
       drugAllergyHistoryText: parsedFlagData.drugAllergyHistoryText || '--',
       historyFoodAllergiesText: parsedFlagData.historyFoodAllergiesText || '--',
-      medicalHistory: medicalHistoryItems.join('、') || '--',
-      medicationHistory: parsedFlagData.pharmacy || '--',
+      allergiesText: allergies.join('、') || '--',
+      medicalHistory: parsedFlagData.preexistingDiseaseText || '--',
+      medicationHistory: data?.medicationHistory || '--',
       bloodTypeText: parsedFlagData.bloodTypeText || '--',
       familyDiseasesText: parsedFlagData.familyDiseasesText || '--',
       diet: diet,
+      dietaryGuidelines: data?.dietaryGuidelines || '',
       responsibleStaff: {
-        nurseAide: '',
-        nurse: '',
-        doctor: ''
+        nurseAide: data?.nurseAssistant || '',
+        nurse: data?.nurse || '',
+        doctor: data?.doctor || ''
       },
-      qr:{
+      asphyxiationByChoking: data?.asphyxiationByChoking || '',
+      pressureSores: data?.pressureSores || '',
+      fallPreventionMeasures: data?.fallPreventionMeasures || '',
+      assessSimpleMentalState: data?.assessSimpleMentalState || '',
+      empyrosis: data?.empyrosis || '',
+      fallDown: data?.fallDown || '',
+      wanderAway: data?.wanderAway || '',
+      antiEntertainment: data?.antiEntertainment || '',
+      commitSuicide: data?.commitSuicide || '',
+      qr: {
         eId: dataForm.value.id,
         tId: dataForm.value.tenantId || parsedFlagData.tenantId
       },
       // 添加解析后的Flag字段中文文本,方便床头卡组件使用
       flagTexts: parsedFlagData
     }
+
+    console.log('床头卡组装后数据:', result)
+    return result
   } catch (error) {
     console.error('处理床头卡数据时发生错误:', error)
     // 返回默认数据
@@ -192,13 +219,14 @@ export const getPatientData = (data,dataElder) => {
       elderName: dataForm.value.elderName || '--',
       elderSex: dataForm.value.elderSex?.toString()=='1'?'男':'女' || '--',
       birthday: formatDate(dataForm.value.birthday, 'YYYY-MM-DD') || '--',
-      checkInTime: dataForm.value.checkInTime ? formatTime(dataForm.value.checkInTime, 'yyyy-MM-dd') : '--',
+      checkInTime: dataForm.value.checkInTime ? formatTime(dataForm.value.checkInTime, 'yyyy-MM-DD') : '--',
       careLevel: dataForm.value.nurseLevelName || '--',
       carePoints: '',
-      allergies: '--',
+      allergiesText: '--',
       medicalHistory: '--',
       medicationHistory: '--',
       bloodTypeText: '--',
+      dietaryGuidelines: '',
       diet: {
         normal: '',
         soft: '',
@@ -229,6 +257,18 @@ const parseFlagFields = (data) => {
   // 保留原始数据
   Object.assign(parsedData, data || {})
 
+  // 如果数据为空,直接返回默认值
+  if (!data) {
+    parsedData.drugAllergyHistoryText = '--'
+    parsedData.historyFoodAllergiesText = '--'
+    parsedData.typesToxinsText = '--'
+    parsedData.disabilitySituationText = '--'
+    parsedData.preexistingDiseaseText = '--'
+    parsedData.familyDiseasesText = '--'
+    parsedData.bloodTypeText = '--'
+    return parsedData
+  }
+
   // 解析数组字段和说明字段
   try {
     // 解析药物过敏史数组 (对应Form.vue中的DICT_TYPE.DRUG_ALLERGY_ARR)
@@ -317,8 +357,25 @@ const parseFlagFields = (data) => {
     // 解析既往疾病数组 (对应Form.vue中的DICT_TYPE.SICK_ARR)
     if (data?.preexistingDisease) {
       let diseases = []
-      if (Array.isArray(data.preexistingDisease)) {
-        diseases = data.preexistingDisease.map(item => getDictLabel(DICT_TYPE.SICK_ARR, item) || item)
+      const val = data.preexistingDisease
+      if (Array.isArray(val)) {
+        diseases = val.map(item => getDictLabel(DICT_TYPE.SICK_ARR, item) || item)
+      } else if (typeof val === 'string') {
+        const trimmed = val.trim()
+        if (trimmed && trimmed !== '[]') {
+          if (trimmed.startsWith('[')) {
+            try {
+              const diseaseList = JSON.parse(trimmed)
+              if (Array.isArray(diseaseList)) {
+                diseases = diseaseList.map(item => getDictLabel(DICT_TYPE.SICK_ARR, item) || item)
+              }
+            } catch (e) {
+              diseases = trimmed.split(/[,,]/).map(s => s.trim()).filter(Boolean)
+            }
+          } else {
+            diseases = trimmed.split(/[,,]/).map(s => s.trim()).filter(Boolean)
+          }
+        }
       }
       parsedData.preexistingDiseaseText = diseases.join('、') || '--'
     }

+ 0 - 1
src/views/elderly/elder/contract/Renewal.vue

@@ -801,7 +801,6 @@ const submitForm = async () => {
       inStatusType: dataForm.value.inStatusType,
       tenantId: dataForm.value.tenantId
     }
-    return
     // if (dataForm.value.inStatusType == '1') {
     //   data.monthlyExpenses.push(...arr)
     // }

+ 1 - 1
src/views/elderly/elder/elder-file/Detail.vue

@@ -109,7 +109,7 @@
     :patientData="dataForm"
     @import-card="importCardFun"
     :title="'床头卡预览'"
-    :width="'900px'"
+    :width="'1000px'"
     @close="handleDialogClose"
   />
   <!-- 分享卡弹窗组件 -->

+ 440 - 119
src/views/elderly/elder/health-record/Form.vue

@@ -96,56 +96,93 @@
           <el-divider />
         </el-col>
         <el-row :gutter="20">
-          <el-col :xs="24" :sm="24" :md="8" :lg="8" :xl="8">
-            <el-form-item label="药物过敏史" prop="drugAllergyHistoryFlag">
-              <el-select
-                v-model="dataForm.drugAllergyHistoryFlag"
-                placeholder="请选择"
-                clearable
-                @change="resetInput('drugAllergyHistory')"
-              >
-                <el-option
-                  v-for="(item, index) in getStrDictOptions(DICT_TYPE.COMMON_STATUS4)"
-                  :key="index"
-                  :label="item.label"
-                  :value="item.value"
-                />
-              </el-select>
-            </el-form-item>
-          </el-col>
-          <el-col :span="16" v-if="dataForm.drugAllergyHistoryFlag == '1'">
-            <el-form-item label="过敏物质">
-              <el-checkbox-group
-                v-model="dataForm.drugAllergyHistory"
-                @change="(arg) => handleChange(arg, 'drugAllergyHistory')"
-              >
-                <el-checkbox
-                  v-for="(item, index) in getStrDictOptions(DICT_TYPE.DRUG_ALLERGY_ARR)"
-                  :label="item.value"
-                  :key="index"
-                  >{{ item.label }}</el-checkbox
-                >
-              </el-checkbox-group>
-              <input
+          <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="8">
+            <el-form-item label="药物过敏史" prop="drugAllergyHistory">
+              <!--              <el-select-->
+              <!--                v-model="dataForm.drugAllergyHistoryFlag"-->
+              <!--                placeholder="请选择"-->
+              <!--                clearable-->
+              <!--                @change="resetInput('drugAllergyHistory')"-->
+              <!--              >-->
+              <!--                <el-option-->
+              <!--                  v-for="(item, index) in getStrDictOptions(DICT_TYPE.COMMON_STATUS4)"-->
+              <!--                  :key="index"-->
+              <!--                  :label="item.label"-->
+              <!--                  :value="item.value"-->
+              <!--                />-->
+              <!--              </el-select>-->
+              <el-input
                 type="text"
-                class="sInput"
-                v-model="drugAllergyHistoryInput"
+                v-model="dataForm.drugAllergyHistory"
                 :disabled="isDetail"
+                placeholder="请输入药物过敏史"
               />
             </el-form-item>
           </el-col>
+          <!--          <el-col :span="16" v-if="dataForm.drugAllergyHistoryFlag == '1'">-->
+          <!--            <el-form-item label="过敏物质">-->
+          <!--              <el-checkbox-group-->
+          <!--                v-model="dataForm.drugAllergyHistory"-->
+          <!--                @change="(arg) => handleChange(arg, 'drugAllergyHistory')"-->
+          <!--              >-->
+          <!--                <el-checkbox-->
+          <!--                  v-for="(item, index) in getStrDictOptions(DICT_TYPE.DRUG_ALLERGY_ARR)"-->
+          <!--                  :label="item.value"-->
+          <!--                  :key="index"-->
+          <!--                  >{{ item.label }}</el-checkbox-->
+          <!--                >-->
+          <!--              </el-checkbox-group>-->
+          <!--            </el-form-item>-->
+          <!--          </el-col>-->
         </el-row>
         <el-row :gutter="20">
-          <el-col :xs="24" :sm="24" :md="8" :lg="8" :xl="8">
-            <el-form-item label="食物过敏史" prop="historyFoodAllergiesFlag">
-              <el-select
-                v-model="dataForm.historyFoodAllergiesFlag"
-                placeholder="请选择"
-                clearable
-                @change="resetInput('historyFoodAllergies')"
-              >
+          <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="8">
+            <el-form-item label="食物过敏史" prop="historyFoodAllergies">
+              <!--              <el-select-->
+              <!--                v-model="dataForm.historyFoodAllergiesFlag"-->
+              <!--                placeholder="请选择"-->
+              <!--                clearable-->
+              <!--                @change="resetInput('historyFoodAllergies')"-->
+              <!--              >-->
+              <!--                <el-option-->
+              <!--                  v-for="(item, index) in getStrDictOptions(DICT_TYPE.COMMON_STATUS4)"-->
+              <!--                  :key="index"-->
+              <!--                  :label="item.label"-->
+              <!--                  :value="item.value"-->
+              <!--                />-->
+              <!--              </el-select>-->
+
+              <el-input
+                type="text"
+                v-model="dataForm.historyFoodAllergies"
+                :disabled="isDetail"
+                placeholder="请输入食物过敏史"
+              />
+            </el-form-item>
+          </el-col>
+
+          <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="8">
+            <el-form-item label="照护要点" prop="careNote">
+              <el-input
+                type="text"
+                v-model="dataForm.careNote"
+                :disabled="isDetail"
+                placeholder="请输入照护要点"
+              />
+            </el-form-item>
+          </el-col>
+
+          <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="8">
+            <el-form-item label="饮食要点" prop="dietaryGuidelines">
+              <el-select v-model="dataForm.dietaryGuidelines" placeholder="请选择" clearable>
                 <el-option
-                  v-for="(item, index) in getStrDictOptions(DICT_TYPE.COMMON_STATUS4)"
+                  v-for="(item, index) in [
+                    { label: '普食', value: '普食' },
+                    { label: '软食', value: '软食' },
+                    { label: '半流质', value: '半流质' },
+                    { label: '流质', value: '流质' },
+                    { label: '鼻饲', value: '鼻饲' }
+                  ]"
                   :key="index"
                   :label="item.label"
                   :value="item.value"
@@ -153,24 +190,6 @@
               </el-select>
             </el-form-item>
           </el-col>
-          <el-col :span="16" v-if="dataForm.historyFoodAllergiesFlag == '1'">
-            <el-form-item label="过敏食物">
-              <el-checkbox-group v-model="dataForm.historyFoodAllergies">
-                <el-checkbox
-                  v-for="(item, index) in getStrDictOptions(DICT_TYPE.FOOD_ALLERGY_ARR)"
-                  :label="item.value"
-                  :key="index"
-                  >{{ item.label }}</el-checkbox
-                >
-              </el-checkbox-group>
-              <input
-                type="text"
-                class="sInput"
-                v-model="historyFoodAllergiesInput"
-                :disabled="isDetail"
-              />
-            </el-form-item>
-          </el-col>
         </el-row>
         <el-col :span="24">
           <el-divider />
@@ -333,6 +352,123 @@
         </el-row>
       </div>
 
+      <div class="info-title">既往史</div>
+      <div class="info-wrap">
+        <el-row :gutter="20">
+          <el-col :xs="24" :sm="24" :md="12" :lg="12" :xl="8">
+            <el-form-item label="既往病史" prop="preexistingDisease">
+              <!--              <el-select-->
+              <!--                v-model="dataForm.diseaseFree"-->
+              <!--                placeholder="请选择"-->
+              <!--                clearable-->
+              <!--                @change="resetInput('preexistingDisease')"-->
+              <!--              >-->
+              <!--                <el-option-->
+              <!--                  v-for="(item, index) in getStrDictOptions(DICT_TYPE.COMMON_STATUS4)"-->
+              <!--                  :key="index"-->
+              <!--                  :label="item.label"-->
+              <!--                  :value="item.value"-->
+              <!--                />-->
+              <!--              </el-select>-->
+              <el-input
+                type="text"
+                placeholder="请输入既往病史"
+                v-model="dataForm.preexistingDisease"
+                :disabled="isDetail"
+              />
+            </el-form-item>
+          </el-col>
+
+          <el-col :xs="24" :sm="24" :md="12" :lg="12" :xl="8">
+            <el-form-item label="用药史" prop="medicationHistory">
+              <el-input
+                type="text"
+                placeholder="请输入用药史"
+                v-model="dataForm.medicationHistory"
+                :disabled="isDetail"
+              />
+            </el-form-item>
+          </el-col>
+        </el-row>
+
+        <el-row :gutter="20">
+          <el-col :xs="24" :sm="8" :md="8" :lg="8" :xl="8">
+            <el-form-item label="责任护士" prop="nurse">
+              <el-input v-model="dataForm.nurse" placeholder="请输入" />
+            </el-form-item>
+          </el-col>
+          <el-col :xs="24" :sm="8" :md="8" :lg="8" :xl="8">
+            <el-form-item label="主管医生" prop="doctor">
+              <el-input v-model="dataForm.doctor" placeholder="请输入" />
+            </el-form-item>
+          </el-col>
+          <el-col :xs="24" :sm="8" :md="8" :lg="8" :xl="8">
+            <el-form-item label="责任护理员" prop="nurseAssistant">
+              <el-input v-model="dataForm.nurseAssistant" placeholder="请输入" />
+            </el-form-item>
+          </el-col>
+        </el-row>
+
+        <div class="risk-table-wrapper">
+          <div style="margin-bottom: 12px; font-weight: bold">长者九防情况</div>
+          <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="dataForm[item.field]"
+                    placeholder="请选择"
+                    style="width: 180px"
+                    :disabled="isDetail"
+                  >
+                    <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
+                    :model-value="dataForm[item.field] === 'low' || dataForm[item.field] === 'none'"
+                    :disabled="isDetail"
+                    size="small"
+                    @change="(val: any) => handleRiskCheckboxChange(item, 'low', val)"
+                    >低危</el-checkbox
+                  >
+                  <el-checkbox
+                    :model-value="dataForm[item.field] === 'medium'"
+                    :disabled="isDetail"
+                    size="small"
+                    @change="(val: any) => handleRiskCheckboxChange(item, 'medium', val)"
+                    >中危</el-checkbox
+                  >
+                  <el-checkbox
+                    :model-value="dataForm[item.field] === 'high'"
+                    :disabled="isDetail"
+                    size="small"
+                    @change="(val: any) => handleRiskCheckboxChange(item, 'high', val)"
+                    >高危</el-checkbox
+                  >
+                </td>
+              </tr>
+            </tbody>
+          </table>
+        </div>
+      </div>
+
       <div class="info-title">现存疾病</div>
       <div class="info-wrap">
         <el-row :gutter="70">
@@ -478,47 +614,6 @@
         </el-row>
       </div>
 
-      <div class="info-title">既往史</div>
-      <div class="info-wrap">
-        <el-row :gutter="20">
-          <el-col :xs="24" :sm="24" :md="8" :lg="8" :xl="8">
-            <el-form-item label="有无疾病" prop="diseaseFree">
-              <el-select
-                v-model="dataForm.diseaseFree"
-                placeholder="请选择"
-                clearable
-                @change="resetInput('preexistingDisease')"
-              >
-                <el-option
-                  v-for="(item, index) in getStrDictOptions(DICT_TYPE.COMMON_STATUS4)"
-                  :key="index"
-                  :label="item.label"
-                  :value="item.value"
-                />
-              </el-select>
-            </el-form-item>
-          </el-col>
-          <el-col :span="24" v-if="dataForm.diseaseFree == '1'">
-            <el-form-item label="疾病" prop="preexistingDisease">
-              <el-checkbox-group v-model="dataForm.preexistingDisease">
-                <el-checkbox
-                  v-for="(item, index) in getStrDictOptions(DICT_TYPE.SICK_ARR)"
-                  :label="item.value"
-                  :key="index"
-                  >{{ item.label }}</el-checkbox
-                >
-              </el-checkbox-group>
-              <input
-                type="text"
-                class="sInput"
-                v-model="preexistingDiseaseInput"
-                :disabled="isDetail"
-              />
-            </el-form-item>
-          </el-col>
-        </el-row>
-      </div>
-
       <div class="info-title">家族史</div>
       <div class="info-wrap">
         <el-row :gutter="20">
@@ -623,7 +718,12 @@
                   trigger: 'blur'
                 }"
               >
-                <SelectUpload v-model="item.fileUrl" :limit="1" fun-name="上传附件" :elder="{ elderId: dataForm.elderId, elderName: dataForm.elderName }"/>
+                <SelectUpload
+                  v-model="item.fileUrl"
+                  :limit="1"
+                  fun-name="上传附件"
+                  :elder="{ elderId: dataForm.elderId, elderName: dataForm.elderName }"
+                />
               </el-form-item>
             </el-col>
           </el-row>
@@ -647,6 +747,17 @@ import {
 } from '@/api/elderly/elder/health-record'
 import { healthRecordFormType } from '../types'
 import { getElderInfoById } from '@/api/elderly/elder/elderly-Info'
+import {
+  asphyxiationPage,
+  pressureSoresPage,
+  fallDownPage,
+  fallPreventionPage,
+  burnPreventionPage,
+  wanderAwayPage,
+  ngasrPage,
+  entertainmentPage,
+  mmseGetPage
+} from '@/api/social-work'
 defineOptions({ name: 'HealthRecordForm' })
 
 const message = useMessage() // 消息弹窗
@@ -673,9 +784,9 @@ const dataForm = ref<healthRecordFormType>({
   drinkLiquor: '',
   medicalPaymentMethods: '',
   drugAllergyHistoryFlag: '',
-  drugAllergyHistory: [],
+  drugAllergyHistory: '',
   historyFoodAllergiesFlag: '',
-  historyFoodAllergies: [],
+  historyFoodAllergies: '',
   exposureSituationFlag: '',
   typesToxins: [],
   protectiveMeasuresFlag: '',
@@ -708,11 +819,27 @@ const dataForm = ref<healthRecordFormType>({
   familyHistoryFlag: '',
   familyDiseases: [],
   diseaseFree: '',
-  preexistingDisease: [],
+  preexistingDisease: '', //既往病史
   geneticHistoryFlag: '',
   geneticDiseaseName: '',
   familyHistoryRemarks: '',
-  attachmentArray: []
+  attachmentArray: [],
+  medicationHistory: '', // 用药史
+  careNote: '', // 照护要点
+  dietaryGuidelines: '', // 饮食要点
+  nurse: '', // 责任护士
+  doctor: '', // 主管医生
+  nurseAssistant: '', // 责任护理员
+  // 九防评估结果
+  asphyxiationByChoking: '',
+  pressureSores: '',
+  fallPreventionMeasures: '',
+  assessSimpleMentalState: '',
+  empyrosis: '',
+  fallDown: '',
+  wanderAway: '',
+  antiEntertainment: '',
+  commitSuicide: ''
 })
 const resetField = ref<healthRecordFormType>(
   JSON.parse(JSON.stringify(Object.assign({}, dataForm)))
@@ -725,12 +852,130 @@ let state = reactive({
   preexistingDiseaseInput: '', // 疾病-其他
   familyDiseasesInput: '' // 家族疾病-其他
 })
+
+// 风险项目表格数据(field 对应后端字段)
+const riskTableItems = ref([
+  { key: 'asphyxiation', name: '防噎食', field: 'asphyxiationByChoking', api: asphyxiationPage },
+  { key: 'pressureUlcer', name: '防压疮', field: 'pressureSores', api: pressureSoresPage },
+  { key: 'bedFall', name: '防坠床', field: 'fallPreventionMeasures', api: fallPreventionPage },
+  {
+    key: 'foodDrug',
+    name: '防误食(简易精神状态)',
+    field: 'assessSimpleMentalState',
+    api: mmseGetPage
+  },
+  { key: 'scald', name: '防烫伤', field: 'empyrosis', api: burnPreventionPage },
+  { key: 'fall', name: '防跌倒', field: 'fallDown', api: fallDownPage },
+  { key: 'wandering', name: '防走失', field: 'wanderAway', api: wanderAwayPage },
+  {
+    key: 'entertainment',
+    name: '防文娱活动意外',
+    field: 'antiEntertainment',
+    api: entertainmentPage
+  },
+  { key: 'selfHarm', name: '防他伤和自伤', field: 'commitSuicide', api: ngasrPage }
+])
+
+// 接口返回的风险数据选项
+const riskOptionsMap = ref<Record<string, any[]>>({
+  asphyxiation: [],
+  pressureUlcer: [],
+  fall: [],
+  bedFall: [],
+  scald: [],
+  wandering: [],
+  selfHarm: [],
+  foodDrug: [],
+  entertainment: []
+})
+
+// 风险等级文本映射
+const riskLevelTextMap: Record<string, string> = {
+  none: '低风险',
+  low: '低风险',
+  medium: '中风险',
+  high: '高风险'
+}
+
+// 获取风险选项(从接口数据)
+const getRiskOptions = (key: string) => {
+  return riskOptionsMap.value[key] || []
+}
+
+// 处理风险程度复选框变化
+const handleRiskCheckboxChange = (item: any, level: string, checked: boolean) => {
+  if (checked) {
+    dataForm.value[item.field] = level
+  } else if (dataForm.value[item.field] === level) {
+    dataForm.value[item.field] = ''
+  }
+}
+
+// 加载长者风险数据(动态调用各九防接口)
+const loadElderRiskData = async (elderId: string) => {
+  try {
+    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) {
+            const levelSet = new Set<string>()
+            res.list.forEach((record: any) => {
+              let riskLevel = record.riskLevel || 'low'
+              if (record.assessData) {
+                try {
+                  const assessData = JSON.parse(record.assessData)
+                  if (assessData.riskLevel) {
+                    riskLevel = assessData.riskLevel
+                  }
+                } catch (e) {
+                  console.error('解析 assessData 失败', e)
+                }
+              }
+              levelSet.add(riskLevel)
+            })
+            const options = Array.from(levelSet).map((level) => ({
+              label: riskLevelTextMap[level] || level,
+              value: level
+            }))
+            riskOptionsMap.value[item.key] = options
+          } else {
+            riskOptionsMap.value[item.key] = []
+          }
+        } catch (err) {
+          console.error(`获取${item.name}数据失败`, err)
+        }
+      }
+    }
+  } catch (e) {
+    console.error('获取风险数据失败', e)
+  }
+}
+
+// 重置风险表格数据
+const resetRiskTableItems = () => {
+  riskOptionsMap.value = {
+    asphyxiation: [],
+    pressureUlcer: [],
+    fall: [],
+    bedFall: [],
+    scald: [],
+    wandering: [],
+    selfHarm: [],
+    foodDrug: [],
+    entertainment: []
+  }
+}
 const {
   drugAllergyHistoryInput,
   historyFoodAllergiesInput,
   typesToxinsInput,
   disabilitySituationInput,
-  preexistingDiseaseInput,
   familyDiseasesInput
 } = toRefs(state)
 
@@ -742,8 +987,8 @@ const open = async (row, elderId, detail) => {
     try {
       const res = await getElderHealthRecordById(elderId)
       let tempList = str2arr(res.attachmentArray)
-      tempList.map(item=>{
-        item.fileUrl = item.fileUrl ? [{fileUrl: item.fileUrl, fileName: item.fileName}] : []
+      tempList.map((item) => {
+        item.fileUrl = item.fileUrl ? [{ fileUrl: item.fileUrl, fileName: item.fileName }] : []
       })
       dataForm.value = {
         elderId: Number(res.elderId),
@@ -757,9 +1002,11 @@ const open = async (row, elderId, detail) => {
         disabilitySituation: str2arr(res.disabilitySituation, 'disabilitySituationInput'),
         hospitalizationHistory: str2arr(res.hospitalizationHistory), // 住院记录
         familyDiseases: str2arr(res.familyDiseases, 'familyDiseasesInput'),
-        preexistingDisease: str2arr(res.preexistingDisease, 'preexistingDiseaseInput'),
+        // preexistingDisease: str2arr(res.preexistingDisease, 'preexistingDiseaseInput'),
         attachmentArray: tempList // 附件上传
       }
+      // 加载长者风险评估数据作为选项(dataForm 中字段已自动回显)
+      await loadElderRiskData(res.elderId)
     } catch (err) {}
   } else {
     // 获取老人信息
@@ -771,6 +1018,8 @@ const open = async (row, elderId, detail) => {
     dataForm.value.liveType = res.liveSituation
     dataForm.value.phone = res.telPhone
     dataForm.value.tenantId = res.tenantId
+    // 加载长者风险评估数据
+    await loadElderRiskData(res.id)
   }
 }
 defineExpose({ open }) // 提供 open 方法,用于打开弹窗
@@ -785,6 +1034,7 @@ const handleClosed = () => {
   for (let key in state) {
     state[key] = ''
   }
+  resetRiskTableItems()
   dialogVisible.value = false
 }
 
@@ -800,14 +1050,17 @@ const submitForm = async () => {
   try {
     let params = {
       ...dataForm.value,
-      drugAllergyHistory: arr2str(dataForm.value.drugAllergyHistory, drugAllergyHistoryInput),
-      historyFoodAllergies: arr2str(dataForm.value.historyFoodAllergies, historyFoodAllergiesInput),
+      drugAllergyHistory: dataForm.value.drugAllergyHistory,
+      historyFoodAllergies: dataForm.value.historyFoodAllergies,
       typesToxins: arr2str(dataForm.value.typesToxins, typesToxinsInput),
       disabilitySituation: arr2str(dataForm.value.disabilitySituation, disabilitySituationInput),
       hospitalizationHistory: arr2str(dataForm.value.hospitalizationHistory),
       familyDiseases: arr2str(dataForm.value.familyDiseases, familyDiseasesInput),
-      preexistingDisease: arr2str(dataForm.value.preexistingDisease, preexistingDiseaseInput),
-      attachmentArray: arr2str(dataForm.value.attachmentArray)
+      preexistingDisease: dataForm.value.preexistingDisease,
+      attachmentArray: arr2str(dataForm.value.attachmentArray),
+      careNote: dataForm.value.careNote,
+      medicationHistory: dataForm.value.medicationHistory,
+      dietaryGuidelines: dataForm.value.dietaryGuidelines
     }
     const res = params.id
       ? await editElderlyHealthRecord(params)
@@ -881,15 +1134,30 @@ const arr2str = (arr, name?) => {
 const str2arr = (str, name?) => {
   let arr: string[] = []
   if (str) {
-    arr = JSON.parse(str)
-    if (str.includes('0-')) {
+    if (Array.isArray(str)) {
+      arr = str.map((item) => String(item))
+    } else if (typeof str === 'string') {
+      try {
+        const parsed = JSON.parse(str)
+        if (Array.isArray(parsed)) {
+          arr = parsed.map((item) => String(item))
+        } else {
+          arr = str.split(/[,,]/).map((s) => s.trim()).filter(Boolean)
+        }
+      } catch (e) {
+        arr = str.split(/[,,]/).map((s) => s.trim()).filter(Boolean)
+      }
+    }
+    if (arr.some((item) => item.includes('0-'))) {
       let index = -1
       arr.map((item: string, i) => {
         if (item.indexOf('0-') > -1) index = i
       })
-      let temp = arr.splice(index, 1)
-      arr.push('0')
-      state[name] = temp.join().split('-')[1]
+      if (index > -1) {
+        let temp = arr.splice(index, 1)
+        arr.push('0')
+        state[name] = temp.join().split('-')[1]
+      }
     }
   }
   return arr
@@ -959,5 +1227,58 @@ const handleChange = (val, type: any) => {
     border-bottom: 1px solid #999;
     outline: none;
   }
+
+  // 风险表格样式
+  .risk-table-wrapper {
+    margin: 20px 0 0;
+    overflow-x: auto;
+
+    .risk-table {
+      width: 100%;
+      border-collapse: collapse;
+      font-size: 14px;
+
+      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;
+        }
+      }
+    }
+  }
 }
 </style>

+ 20 - 4
src/views/elderly/elder/types.ts

@@ -18,9 +18,9 @@ export interface healthRecordFormType {
   drinkLiquor: string
   medicalPaymentMethods: string
   drugAllergyHistoryFlag: string
-  drugAllergyHistory: []
+  drugAllergyHistory: string
   historyFoodAllergiesFlag: string
-  historyFoodAllergies: []
+  historyFoodAllergies: string
   exposureSituationFlag: string
   typesToxins: []
   protectiveMeasuresFlag: string
@@ -53,11 +53,27 @@ export interface healthRecordFormType {
   familyHistoryFlag: string
   familyDiseases: []
   diseaseFree: string
-  preexistingDisease: []
+  preexistingDisease: string //既往病史
   geneticHistoryFlag: string
   geneticDiseaseName: string
   familyHistoryRemarks: string
   attachmentArray: attachmentArrayType[]
+  medicationHistory: string // 用药史
+  careNote: string // 照护要点
+  dietaryGuidelines: string // 饮食要点
+  // 九防评估结果
+  asphyxiationByChoking?: string // 防噎食
+  pressureSores?: string // 防压疮
+  fallPreventionMeasures?: string // 防坠床
+  assessSimpleMentalState?: string // 防误食(简易精神状态)
+  empyrosis?: string // 防烫伤
+  fallDown?: string // 防跌倒
+  wanderAway?: string // 防走失
+  antiEntertainment?: string // 防文娱活动意外
+  commitSuicide?: string // 防他伤和自伤
+  nurse: string // 责任护士
+  doctor: string // 主管医生
+  nurseAssistant: string // 责任护理员
 }
 
 export interface hospitalizationHistoryType {
@@ -348,7 +364,7 @@ export interface healthRecordMedicalRecordPrintType {
   maritalStatus?: string
   medicalPaymentMethods?: string
   drugAllergyHistoryFlag?: string
-  drugAllergyHistory?: any
+  drugAllergyHistory?: string
   preexistingDisease?: any
   diseaseFree?: string
   idCard?: string

+ 2 - 2
src/views/elderly/restaurant/satisfactionSurvey/index.vue

@@ -324,11 +324,11 @@ const getGrandTotal = (row: SurveyRecord) =>
 const getTenantNameById = (tenantId?: number) => {
   const options = userStore.orgTenant?.options || []
   const found = options.find((item) => Number(item.value ?? item.id) === Number(tenantId))
-  return found?.label ?? found?.name ?? '-'
+  return (found?.label ?? found?.name) ? (found?.label ?? found?.name) + '/' : ''
 }
 
 const getTenantUserText = (record: SurveyRecord) =>
-  `${record.tenantName || getTenantNameById(record.tenantId)} / ${record.submitter || '-'}`
+  `${(record.tenantName?record.tenantName+'/':undefined) || getTenantNameById(record.tenantId)}${record.submitter || ''}`
 
 const normalizeRecord = (raw: any): SurveyRecord => {
   const qualityItems = qualityItemTemplates.map((item) => ({