Procházet zdrojové kódy

更新预约功能4

chenjun před 3 týdny
rodič
revize
758b3378d4
35 změnil soubory, kde provedl 1588 přidání a 209 odebrání
  1. 8 0
      src/views/elderly/apply/nine-precautions/MMSE/index.vue
  2. 8 0
      src/views/elderly/apply/nine-precautions/anti-entertainment/index.vue
  3. 8 0
      src/views/elderly/apply/nine-precautions/asphyxiation-by-choking/index.vue
  4. 8 0
      src/views/elderly/apply/nine-precautions/attack/index.vue
  5. 8 0
      src/views/elderly/apply/nine-precautions/commit-suicide/index.vue
  6. 8 1
      src/views/elderly/apply/nine-precautions/communication/index.vue
  7. 29 16
      src/views/elderly/apply/nine-precautions/daily-life/index.vue
  8. 8 0
      src/views/elderly/apply/nine-precautions/empyrosis/index.vue
  9. 8 0
      src/views/elderly/apply/nine-precautions/equilibrium/index.vue
  10. 8 0
      src/views/elderly/apply/nine-precautions/fall-down/index.vue
  11. 8 0
      src/views/elderly/apply/nine-precautions/fall-prevention-measures/index.vue
  12. 29 16
      src/views/elderly/apply/nine-precautions/nutritional-risk/index.vue
  13. 8 1
      src/views/elderly/apply/nine-precautions/pressure-sores/index.vue
  14. 33 25
      src/views/elderly/apply/nine-precautions/wander-away/index.vue
  15. 75 2
      src/views/elderly/contracts/change-confirmation-form/AddForm.vue
  16. 76 2
      src/views/elderly/contracts/check-in-tab/AddForm.vue
  17. 82 2
      src/views/elderly/contracts/comprehensive-assessment-capabilities/AddForm.vue
  18. 77 4
      src/views/elderly/contracts/delegation-agent-confirmation-form/AddForm.vue
  19. 80 3
      src/views/elderly/contracts/elder-safety-commitment/AddForm.vue
  20. 80 2
      src/views/elderly/contracts/explanation-examination-report-items/AddForm.vue
  21. 75 2
      src/views/elderly/contracts/first-service-project-confirmation/AddForm.vue
  22. 80 2
      src/views/elderly/contracts/guardian-party-b/AddForm.vue
  23. 83 2
      src/views/elderly/contracts/identification-document-partyb/AddForm.vue
  24. 80 3
      src/views/elderly/contracts/outing-confirmation-form/AddForm.vue
  25. 76 3
      src/views/elderly/contracts/power-of-attorney/AddForm.vue
  26. 79 2
      src/views/elderly/contracts/registration-certificate-civil-affairs-department/AddForm.vue
  27. 75 2
      src/views/elderly/contracts/risk-disclosure-statement/AddForm.vue
  28. 77 4
      src/views/elderly/contracts/room-facilities-equipment/AddForm.vue
  29. 80 3
      src/views/elderly/contracts/service-charging-standards-institution/AddForm.vue
  30. 80 3
      src/views/elderly/contracts/signature-proxy-application/AddForm.vue
  31. 60 47
      src/views/elderly/elder/family-appointment/time-setting/index.vue
  32. 70 60
      src/views/social-worker/assessment/PerceptionAndCommunication/index.vue
  33. 8 0
      src/views/social-worker/assessment/SAS/index.vue
  34. 8 2
      src/views/social-worker/assessment/SDS/index.vue
  35. 8 0
      src/views/social-worker/assessment/psychological-social-situation/index.vue

+ 8 - 0
src/views/elderly/apply/nine-precautions/MMSE/index.vue

@@ -130,6 +130,14 @@
         min-width="150"
         show-overflow-tooltip
       />
+      <el-table-column
+        prop="bedName"
+        header-align="center"
+        align="center"
+        label="床位号"
+        min-width="150"
+        show-overflow-tooltip
+      />
       <el-table-column
         prop="assessor"
         header-align="center"

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

@@ -123,6 +123,14 @@
         min-width="150"
         show-overflow-tooltip
       />
+      <el-table-column
+        prop="bedName"
+        header-align="center"
+        align="center"
+        label="床位号"
+        min-width="150"
+        show-overflow-tooltip
+      />
       <el-table-column
         prop="assessor"
         header-align="center"

+ 8 - 0
src/views/elderly/apply/nine-precautions/asphyxiation-by-choking/index.vue

@@ -97,6 +97,14 @@
         min-width="150"
         show-overflow-tooltip
       />
+      <el-table-column
+        prop="bedName"
+        header-align="center"
+        align="center"
+        label="床位号"
+        min-width="150"
+        show-overflow-tooltip
+      />
       <el-table-column
         prop="assessor"
         header-align="center"

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

@@ -130,6 +130,14 @@
         min-width="150"
         show-overflow-tooltip
       />
+      <el-table-column
+        prop="bedName"
+        header-align="center"
+        align="center"
+        label="床位号"
+        min-width="150"
+        show-overflow-tooltip
+      />
       <el-table-column
         prop="assessor"
         header-align="center"

+ 8 - 0
src/views/elderly/apply/nine-precautions/commit-suicide/index.vue

@@ -130,6 +130,14 @@
         min-width="150"
         show-overflow-tooltip
       />
+      <el-table-column
+        prop="bedName"
+        header-align="center"
+        align="center"
+        label="床位号"
+        min-width="150"
+        show-overflow-tooltip
+      />
       <el-table-column
         prop="assessor"
         header-align="center"

+ 8 - 1
src/views/elderly/apply/nine-precautions/communication/index.vue

@@ -130,6 +130,14 @@
         min-width="150"
         show-overflow-tooltip
       />
+      <el-table-column
+        prop="bedName"
+        header-align="center"
+        align="center"
+        label="床位号"
+        min-width="150"
+        show-overflow-tooltip
+      />
       <el-table-column
         prop="assessor"
         header-align="center"
@@ -319,7 +327,6 @@ const handleImportCard = async () => {
   }
 }
 
-
 /** 查询列表 */
 const getList = async () => {
   loading.value = true

+ 29 - 16
src/views/elderly/apply/nine-precautions/daily-life/index.vue

@@ -80,6 +80,14 @@
         min-width="150"
         show-overflow-tooltip
       />
+      <el-table-column
+        prop="bedName"
+        header-align="center"
+        align="center"
+        label="床位号"
+        min-width="150"
+        show-overflow-tooltip
+      />
       <el-table-column
         prop="assessor"
         header-align="center"
@@ -214,36 +222,41 @@ const handleImportCard = async () => {
 
     const headers = [
       {
-            'key': 'orgName',
-            'title': '机构名称'
+        key: 'orgName',
+        title: '机构名称'
       },
       {
-            'key': 'elderName',
-            'title': '长者姓名'
+        key: 'elderName',
+        title: '长者姓名'
       },
       {
-            'key': 'assessor',
-            'title': '评估人'
+        key: 'assessor',
+        title: '评估人'
       },
       {
-            'key': 'assessDate',
-            'title': '记录日期'
+        key: 'assessDate',
+        title: '记录日期'
       },
       {
-            'key': 'assessScore',
-            'title': '评估总得分'
+        key: 'assessScore',
+        title: '评估总得分'
       },
       {
-            'key': 'riskLevelText',
-            'title': '结果等级'
+        key: 'riskLevelText',
+        title: '结果等级'
       },
       {
-            'key': 'creator',
-            'title': '记录人'
+        key: 'creator',
+        title: '记录人'
       }
-]
+    ]
 
-    exportWithExpandedObjectArrays(processedData, headers, `日常生活活动能力评估_${new Date().getTime()}.xlsx`, '日常生活活动能力评估')
+    exportWithExpandedObjectArrays(
+      processedData,
+      headers,
+      `日常生活活动能力评估_${new Date().getTime()}.xlsx`,
+      '日常生活活动能力评估'
+    )
     message.success('导出成功')
   } catch (error) {
     console.error('导出失败:', error)

+ 8 - 0
src/views/elderly/apply/nine-precautions/empyrosis/index.vue

@@ -97,6 +97,14 @@
         min-width="150"
         show-overflow-tooltip
       />
+      <el-table-column
+        prop="bedName"
+        header-align="center"
+        align="center"
+        label="床位号"
+        min-width="150"
+        show-overflow-tooltip
+      />
       <el-table-column
         prop="assessor"
         header-align="center"

+ 8 - 0
src/views/elderly/apply/nine-precautions/equilibrium/index.vue

@@ -97,6 +97,14 @@
         min-width="150"
         show-overflow-tooltip
       />
+      <el-table-column
+        prop="bedName"
+        header-align="center"
+        align="center"
+        label="床位号"
+        min-width="150"
+        show-overflow-tooltip
+      />
       <el-table-column
         prop="assessor"
         header-align="center"

+ 8 - 0
src/views/elderly/apply/nine-precautions/fall-down/index.vue

@@ -97,6 +97,14 @@
         min-width="150"
         show-overflow-tooltip
       />
+      <el-table-column
+        prop="bedName"
+        header-align="center"
+        align="center"
+        label="床位号"
+        min-width="150"
+        show-overflow-tooltip
+      />
       <el-table-column
         prop="assessor"
         header-align="center"

+ 8 - 0
src/views/elderly/apply/nine-precautions/fall-prevention-measures/index.vue

@@ -97,6 +97,14 @@
         min-width="150"
         show-overflow-tooltip
       />
+      <el-table-column
+        prop="bedName"
+        header-align="center"
+        align="center"
+        label="床位号"
+        min-width="150"
+        show-overflow-tooltip
+      />
       <el-table-column
         prop="assessor"
         header-align="center"

+ 29 - 16
src/views/elderly/apply/nine-precautions/nutritional-risk/index.vue

@@ -67,36 +67,41 @@ const handleImportCard = async () => {
 
     const headers = [
       {
-            'key': 'orgName',
-            'title': '机构名称'
+        key: 'orgName',
+        title: '机构名称'
       },
       {
-            'key': 'elderName',
-            'title': '长者姓名'
+        key: 'elderName',
+        title: '长者姓名'
       },
       {
-            'key': 'assessor',
-            'title': '评估人'
+        key: 'assessor',
+        title: '评估人'
       },
       {
-            'key': 'assessDate',
-            'title': '记录日期'
+        key: 'assessDate',
+        title: '记录日期'
       },
       {
-            'key': 'assessScore',
-            'title': '量表总分'
+        key: 'assessScore',
+        title: '量表总分'
       },
       {
-            'key': 'riskLevelText',
-            'title': '评估结果'
+        key: 'riskLevelText',
+        title: '评估结果'
       },
       {
-            'key': 'creator',
-            'title': '记录人'
+        key: 'creator',
+        title: '记录人'
       }
-]
+    ]
 
-    exportWithExpandedObjectArrays(processedData, headers, `营养风险评估_${new Date().getTime()}.xlsx`, '营养风险评估')
+    exportWithExpandedObjectArrays(
+      processedData,
+      headers,
+      `营养风险评估_${new Date().getTime()}.xlsx`,
+      '营养风险评估'
+    )
     message.success('导出成功')
   } catch (error) {
     console.error('导出失败:', error)
@@ -304,6 +309,14 @@ onMounted(async () => {
         min-width="150"
         show-overflow-tooltip
       />
+      <el-table-column
+        prop="bedName"
+        header-align="center"
+        align="center"
+        label="床位号"
+        min-width="150"
+        show-overflow-tooltip
+      />
       <el-table-column
         prop="assessor"
         header-align="center"

+ 8 - 1
src/views/elderly/apply/nine-precautions/pressure-sores/index.vue

@@ -97,6 +97,14 @@
         min-width="150"
         show-overflow-tooltip
       />
+      <el-table-column
+        prop="bedName"
+        header-align="center"
+        align="center"
+        label="床位号"
+        min-width="150"
+        show-overflow-tooltip
+      />
       <el-table-column
         prop="assessor"
         header-align="center"
@@ -173,7 +181,6 @@ 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 { getCurrentMonthRange } from '@/utils/dateUtil'
 import { pressureSoresDelete, pressureSoresPage } from '@/api/social-work'
 import { exportWithExpandedObjectArrays } from '@/utils/excel-export'
 import { findLabelById } from '@/utils/dict'

+ 33 - 25
src/views/elderly/apply/nine-precautions/wander-away/index.vue

@@ -35,31 +35,31 @@
         </el-select>
       </el-form-item>
 
-<!--      <el-form-item label="楼栋">-->
-<!--        <el-select-->
-<!--          v-model="queryParams.buildId"-->
-<!--          placeholder="选择楼栋"-->
-<!--          style="width: 180px"-->
-<!--          @change="handleBuildChange"-->
-<!--        >-->
-<!--          <el-option-->
-<!--            v-for="(item, index) in buildList"-->
-<!--            :key="index"-->
-<!--            :label="item.buildName"-->
-<!--            :value="item.id"-->
-<!--          />-->
-<!--        </el-select>-->
-<!--      </el-form-item>-->
-<!--      <el-form-item label="楼层">-->
-<!--        <el-select v-model="queryParams.floorId" placeholder="选择楼层" style="width: 180px">-->
-<!--          <el-option-->
-<!--            v-for="(item, index) in floorList"-->
-<!--            :key="index"-->
-<!--            :label="item.floorName"-->
-<!--            :value="item.id"-->
-<!--          />-->
-<!--        </el-select>-->
-<!--      </el-form-item>-->
+      <!--      <el-form-item label="楼栋">-->
+      <!--        <el-select-->
+      <!--          v-model="queryParams.buildId"-->
+      <!--          placeholder="选择楼栋"-->
+      <!--          style="width: 180px"-->
+      <!--          @change="handleBuildChange"-->
+      <!--        >-->
+      <!--          <el-option-->
+      <!--            v-for="(item, index) in buildList"-->
+      <!--            :key="index"-->
+      <!--            :label="item.buildName"-->
+      <!--            :value="item.id"-->
+      <!--          />-->
+      <!--        </el-select>-->
+      <!--      </el-form-item>-->
+      <!--      <el-form-item label="楼层">-->
+      <!--        <el-select v-model="queryParams.floorId" placeholder="选择楼层" style="width: 180px">-->
+      <!--          <el-option-->
+      <!--            v-for="(item, index) in floorList"-->
+      <!--            :key="index"-->
+      <!--            :label="item.floorName"-->
+      <!--            :value="item.id"-->
+      <!--          />-->
+      <!--        </el-select>-->
+      <!--      </el-form-item>-->
 
       <el-form-item label="评估人">
         <el-input v-model="queryParams.assessor" placeholder="评估人" class="!w-240px" clearable />
@@ -123,6 +123,14 @@
         min-width="150"
         show-overflow-tooltip
       />
+      <el-table-column
+        prop="bedName"
+        header-align="center"
+        align="center"
+        label="床位号"
+        min-width="150"
+        show-overflow-tooltip
+      />
       <el-table-column
         prop="assessor"
         header-align="center"

+ 75 - 2
src/views/elderly/contracts/change-confirmation-form/AddForm.vue

@@ -76,6 +76,9 @@
 
     <template #footer>
       <el-button @click="handleClosed">关闭</el-button>
+      <el-button type="success" size="small" v-show="isDetail" @click="handlePrint"
+        >打印/导出</el-button
+      >
       <el-button
         style="margin-left: 22px; margin-right: 30px"
         v-loading="formLoading"
@@ -86,13 +89,22 @@
       >
     </template>
   </el-drawer>
+
+  <Teleport to="body">
+    <div v-if="isPrint" class="print-container">
+      <div class="print-org-name">{{ orgName }}</div>
+      <ChangeConfirmationFormBody v-model="changeForm" :is-text-mode="true" />
+    </div>
+  </Teleport>
 </template>
 
 <script lang="ts" setup>
-import { ref, reactive } from 'vue'
+import { ref, reactive, computed, nextTick } from 'vue'
 
 import dayjs from 'dayjs'
 import ChangeConfirmationFormBody from '../components/ChangeConfirmationFormBody.vue'
+import { useUserStore } from '@/store/modules/user'
+import { findLabelById } from '@/utils/dict'
 
 import {
   changeConfirmationForm_create,
@@ -101,12 +113,20 @@ import {
 } from '@/api/elderly/contracts'
 const message = useMessage()
 const { t } = useI18n()
+const userStore = useUserStore()
 const title = ref('')
 const dialogVisible = ref(false)
+const formLoading = ref(false)
 const selectElderRef = ref()
 const bodyRef = ref()
 const isDetail = ref(false)
-const formLoading = ref(false)
+const isPrint = ref(false)
+const orgName = computed(
+  () =>
+    findLabelById(userStore.getOrgTenant?.options || [], dataForm.value.tenantId) ||
+    userStore.getTenantName ||
+    ''
+)
 let dataForm = ref({
   id: undefined,
   elderName: '',
@@ -235,6 +255,16 @@ const handleClosed = () => {
   dialogVisible.value = false
   resetForm()
 }
+
+const handlePrint = async () => {
+  isPrint.value = true
+  await nextTick()
+  await new Promise((resolve) => setTimeout(resolve, 1500))
+  window.print()
+  setTimeout(() => {
+    isPrint.value = false
+  }, 500)
+}
 </script>
 
 <style scoped lang="scss">
@@ -267,3 +297,46 @@ const handleClosed = () => {
   }
 }
 </style>
+
+<style lang="scss">
+.print-container {
+  display: none;
+}
+
+@media print {
+  html,
+  body {
+    background: #fff !important;
+    margin: 0 !important;
+    padding: 0 !important;
+    overflow: visible !important;
+  }
+
+  body > *:not(.print-container) {
+    display: none !important;
+  }
+
+  body > .print-container {
+    display: block !important;
+  }
+
+  .print-container .print-org-name {
+    text-align: start;
+    font-size: 14px;
+    margin-bottom: 12px;
+  }
+
+  .print-container > *:not(.print-org-name) {
+    width: 210mm !important;
+    max-width: none !important;
+    margin: 0 !important;
+    padding: 0 !important;
+    box-sizing: border-box !important;
+  }
+
+  @page {
+    size: 210mm 297mm;
+    margin: 16mm;
+  }
+}
+</style>

+ 76 - 2
src/views/elderly/contracts/check-in-tab/AddForm.vue

@@ -74,8 +74,15 @@
       </div>
     </div>
 
-    <template #footer>
+        <template #footer>
       <el-button @click="handleClosed">关闭</el-button>
+      <el-button
+        type="success"
+        size="small"
+        v-show="isDetail"
+        @click="handlePrint"
+        >打印/导出</el-button
+      >
       <el-button
         style="margin-left: 22px; margin-right: 30px"
         v-loading="formLoading"
@@ -86,13 +93,22 @@
       >
     </template>
   </el-drawer>
+
+  <Teleport to="body">
+    <div v-if="isPrint" class="print-container">
+      <div class="print-org-name">{{ orgName }}</div>
+      <CheckInRegistrationBody v-model="checkInRegistrationForm" :is-text-mode="true" :elder-id="dataForm.elderId" />
+    </div>
+  </Teleport>
 </template>
 
 <script lang="ts" setup>
-import { ref, reactive } from 'vue'
+import { ref, reactive, computed, nextTick } from 'vue'
 
 import dayjs from 'dayjs'
 import CheckInRegistrationBody from '../components/CheckInRegistrationBody.vue'
+import { useUserStore } from '@/store/modules/user'
+import { findLabelById } from '@/utils/dict'
 
 import {
   checkInRegistration_create,
@@ -101,12 +117,17 @@ import {
 } from '@/api/elderly/contracts'
 const message = useMessage()
 const { t } = useI18n()
+const userStore = useUserStore()
 const title = ref('')
 const dialogVisible = ref(false)
 const selectElderRef = ref()
 const bodyRef = ref()
 const isDetail = ref(false)
 const formLoading = ref(false)
+const isPrint = ref(false)
+const orgName = computed(() =>
+  findLabelById(userStore.getOrgTenant?.options || [], dataForm.value.tenantId) || userStore.getTenantName || ''
+)
 let dataForm = ref({
   id: undefined,
   elderName: '',
@@ -444,6 +465,16 @@ const handleClosed = () => {
   dialogVisible.value = false
   resetForm()
 }
+
+const handlePrint = async () => {
+  isPrint.value = true
+  await nextTick()
+  await new Promise((resolve) => setTimeout(resolve, 1500))
+  window.print()
+  setTimeout(() => {
+    isPrint.value = false
+  }, 500)
+}
 </script>
 
 <style scoped lang="scss">
@@ -476,3 +507,46 @@ const handleClosed = () => {
   }
 }
 </style>
+
+<style lang="scss">
+.print-container {
+  display: none;
+}
+
+@media print {
+  html,
+  body {
+    background: #fff !important;
+    margin: 0 !important;
+    padding: 0 !important;
+    overflow: visible !important;
+  }
+
+  body > *:not(.print-container) {
+    display: none !important;
+  }
+
+  body > .print-container {
+    display: block !important;
+  }
+
+  .print-container .print-org-name {
+    text-align: start;
+    font-size: 14px;
+    margin-bottom: 12px;
+  }
+
+  .print-container > *:not(.print-org-name) {
+    width: 210mm !important;
+    max-width: none !important;
+    margin: 0 !important;
+    padding: 0 !important;
+    box-sizing: border-box !important;
+  }
+
+  @page {
+    size: 210mm 297mm;
+    margin: 16mm;
+  }
+}
+</style>

+ 82 - 2
src/views/elderly/contracts/comprehensive-assessment-capabilities/AddForm.vue

@@ -84,6 +84,9 @@
 
     <template #footer>
       <el-button @click="handleClosed">关闭</el-button>
+      <el-button type="success" size="small" v-show="isDetail" @click="handlePrint"
+        >打印/导出</el-button
+      >
       <el-button
         style="margin-left: 22px; margin-right: 30px"
         v-loading="formLoading"
@@ -94,13 +97,29 @@
       >
     </template>
   </el-drawer>
+
+  <Teleport to="body">
+    <div v-if="isPrint" class="print-container">
+      <div class="print-org-name">{{ orgName }}</div>
+      <DocumentAttachmentBody
+        v-model="attachmentForm"
+        :is-text-mode="true"
+        title="老年人能力综合评估结果"
+        :elder-id="dataForm.elderId"
+        :elder-name="dataForm.elderName"
+        fun-name="老年人能力综合评估"
+      />
+    </div>
+  </Teleport>
 </template>
 
 <script lang="ts" setup>
-import { ref, reactive } from 'vue'
+import { ref, reactive, computed, nextTick } from 'vue'
 
 import dayjs from 'dayjs'
 import DocumentAttachmentBody from '../components/DocumentAttachmentBody.vue'
+import { useUserStore } from '@/store/modules/user'
+import { findLabelById } from '@/utils/dict'
 
 import {
   comprehensiveAssessmentCapabilities_create,
@@ -109,12 +128,20 @@ import {
 } from '@/api/elderly/contracts'
 const message = useMessage()
 const { t } = useI18n()
+const userStore = useUserStore()
 const title = ref('')
 const dialogVisible = ref(false)
+const formLoading = ref(false)
 const selectElderRef = ref()
 const bodyRef = ref()
 const isDetail = ref(false)
-const formLoading = ref(false)
+const isPrint = ref(false)
+const orgName = computed(
+  () =>
+    findLabelById(userStore.getOrgTenant?.options || [], dataForm.value.tenantId) ||
+    userStore.getTenantName ||
+    ''
+)
 let dataForm = ref({
   id: undefined,
   elderName: '',
@@ -247,6 +274,16 @@ const handleClosed = () => {
   dialogVisible.value = false
   resetForm()
 }
+
+const handlePrint = async () => {
+  isPrint.value = true
+  await nextTick()
+  await new Promise((resolve) => setTimeout(resolve, 1500))
+  window.print()
+  setTimeout(() => {
+    isPrint.value = false
+  }, 500)
+}
 </script>
 
 <style scoped lang="scss">
@@ -279,3 +316,46 @@ const handleClosed = () => {
   }
 }
 </style>
+
+<style lang="scss">
+.print-container {
+  display: none;
+}
+
+@media print {
+  html,
+  body {
+    background: #fff !important;
+    margin: 0 !important;
+    padding: 0 !important;
+    overflow: visible !important;
+  }
+
+  body > *:not(.print-container) {
+    display: none !important;
+  }
+
+  body > .print-container {
+    display: block !important;
+  }
+
+  .print-container .print-org-name {
+    text-align: start;
+    font-size: 14px;
+    margin-bottom: 12px;
+  }
+
+  .print-container > *:not(.print-org-name) {
+    width: 210mm !important;
+    max-width: none !important;
+    margin: 0 !important;
+    padding: 0 !important;
+    box-sizing: border-box !important;
+  }
+
+  @page {
+    size: 210mm 297mm;
+    margin: 16mm;
+  }
+}
+</style>

+ 77 - 4
src/views/elderly/contracts/delegation-agent-confirmation-form/AddForm.vue

@@ -80,6 +80,9 @@
 
     <template #footer>
       <el-button @click="handleClosed">关闭</el-button>
+      <el-button type="success" size="small" v-show="isDetail" @click="handlePrint"
+        >打印/导出</el-button
+      >
       <el-button
         style="margin-left: 22px; margin-right: 30px"
         v-loading="formLoading"
@@ -90,13 +93,22 @@
       >
     </template>
   </el-drawer>
+
+  <Teleport to="body">
+    <div v-if="isPrint" class="print-container">
+      <div class="print-org-name">{{ orgName }}</div>
+      <DelegationAgentConfirmationBody v-model="delegationAgentForm" :is-text-mode="true" />
+    </div>
+  </Teleport>
 </template>
 
 <script lang="ts" setup>
-import { ref, reactive } from 'vue'
+import { ref, reactive, computed, nextTick } from 'vue'
 
 import dayjs from 'dayjs'
 import DelegationAgentConfirmationBody from '../components/DelegationAgentConfirmationBody.vue'
+import { useUserStore } from '@/store/modules/user'
+import { findLabelById } from '@/utils/dict'
 
 import {
   delegationAgentConfirmation_create,
@@ -105,12 +117,20 @@ import {
 } from '@/api/elderly/contracts'
 const message = useMessage()
 const { t } = useI18n()
+const userStore = useUserStore()
 const title = ref('')
 const dialogVisible = ref(false)
+const formLoading = ref(false)
 const selectElderRef = ref()
 const bodyRef = ref()
 const isDetail = ref(false)
-const formLoading = ref(false)
+const isPrint = ref(false)
+const orgName = computed(
+  () =>
+    findLabelById(userStore.getOrgTenant?.options || [], dataForm.value.tenantId) ||
+    userStore.getTenantName ||
+    ''
+)
 let dataForm = ref({
   id: undefined,
   elderName: '',
@@ -129,8 +149,8 @@ const elderUp = (e) => {
   dataForm.value.contractNumber = e.contractNumber || e.fileNumber
   delegationAgentForm.value.elderName = e.elderName
   delegationAgentForm.value.elderGender = e.elderSex == 1 ? '男' : e.elderSex == 2 ? '女' : ''
-  delegationAgentForm.value.elderAge = e.elderAge||''
-  delegationAgentForm.value.elderIdCardNo = e.idCard||''
+  delegationAgentForm.value.elderAge = e.elderAge || ''
+  delegationAgentForm.value.elderIdCardNo = e.idCard || ''
 }
 
 const delegationAgentForm = ref({
@@ -272,6 +292,16 @@ const handleClosed = () => {
   dialogVisible.value = false
   resetForm()
 }
+
+const handlePrint = async () => {
+  isPrint.value = true
+  await nextTick()
+  await new Promise((resolve) => setTimeout(resolve, 1500))
+  window.print()
+  setTimeout(() => {
+    isPrint.value = false
+  }, 500)
+}
 </script>
 
 <style scoped lang="scss">
@@ -304,3 +334,46 @@ const handleClosed = () => {
   }
 }
 </style>
+
+<style lang="scss">
+.print-container {
+  display: none;
+}
+
+@media print {
+  html,
+  body {
+    background: #fff !important;
+    margin: 0 !important;
+    padding: 0 !important;
+    overflow: visible !important;
+  }
+
+  body > *:not(.print-container) {
+    display: none !important;
+  }
+
+  body > .print-container {
+    display: block !important;
+  }
+
+  .print-container .print-org-name {
+    text-align: start;
+    font-size: 14px;
+    margin-bottom: 12px;
+  }
+
+  .print-container > *:not(.print-org-name) {
+    width: 210mm !important;
+    max-width: none !important;
+    margin: 0 !important;
+    padding: 0 !important;
+    box-sizing: border-box !important;
+  }
+
+  @page {
+    size: 210mm 297mm;
+    margin: 16mm;
+  }
+}
+</style>

+ 80 - 3
src/views/elderly/contracts/elder-safety-commitment/AddForm.vue

@@ -70,12 +70,19 @@
 
       <!-- 内容区域 -->
       <div class="form-body">
-        <ElderSafetyCommitmentBody ref="bodyRef" v-model="safetyCommitmentForm" :is-text-mode="isDetail" />
+        <ElderSafetyCommitmentBody
+          ref="bodyRef"
+          v-model="safetyCommitmentForm"
+          :is-text-mode="isDetail"
+        />
       </div>
     </div>
 
     <template #footer>
       <el-button @click="handleClosed">关闭</el-button>
+      <el-button type="success" size="small" v-show="isDetail" @click="handlePrint"
+        >打印/导出</el-button
+      >
       <el-button
         style="margin-left: 22px; margin-right: 30px"
         v-loading="formLoading"
@@ -86,13 +93,22 @@
       >
     </template>
   </el-drawer>
+
+  <Teleport to="body">
+    <div v-if="isPrint" class="print-container">
+      <div class="print-org-name">{{ orgName }}</div>
+      <ElderSafetyCommitmentBody v-model="safetyCommitmentForm" :is-text-mode="true" />
+    </div>
+  </Teleport>
 </template>
 
 <script lang="ts" setup>
-import { ref, reactive } from 'vue'
+import { ref, reactive, computed, nextTick } from 'vue'
 
 import dayjs from 'dayjs'
 import ElderSafetyCommitmentBody from '../components/ElderSafetyCommitmentBody.vue'
+import { useUserStore } from '@/store/modules/user'
+import { findLabelById } from '@/utils/dict'
 
 import {
   elderSafetyCommitment_create,
@@ -101,12 +117,20 @@ import {
 } from '@/api/elderly/contracts'
 const message = useMessage()
 const { t } = useI18n()
+const userStore = useUserStore()
 const title = ref('')
 const dialogVisible = ref(false)
+const formLoading = ref(false)
 const selectElderRef = ref()
 const bodyRef = ref()
 const isDetail = ref(false)
-const formLoading = ref(false)
+const isPrint = ref(false)
+const orgName = computed(
+  () =>
+    findLabelById(userStore.getOrgTenant?.options || [], dataForm.value.tenantId) ||
+    userStore.getTenantName ||
+    ''
+)
 let dataForm = ref({
   id: undefined,
   elderName: '',
@@ -240,6 +264,16 @@ const handleClosed = () => {
   dialogVisible.value = false
   resetForm()
 }
+
+const handlePrint = async () => {
+  isPrint.value = true
+  await nextTick()
+  await new Promise((resolve) => setTimeout(resolve, 1500))
+  window.print()
+  setTimeout(() => {
+    isPrint.value = false
+  }, 500)
+}
 </script>
 
 <style scoped lang="scss">
@@ -272,3 +306,46 @@ const handleClosed = () => {
   }
 }
 </style>
+
+<style lang="scss">
+.print-container {
+  display: none;
+}
+
+@media print {
+  html,
+  body {
+    background: #fff !important;
+    margin: 0 !important;
+    padding: 0 !important;
+    overflow: visible !important;
+  }
+
+  body > *:not(.print-container) {
+    display: none !important;
+  }
+
+  body > .print-container {
+    display: block !important;
+  }
+
+  .print-container .print-org-name {
+    text-align: start;
+    font-size: 14px;
+    margin-bottom: 12px;
+  }
+
+  .print-container > *:not(.print-org-name) {
+    width: 210mm !important;
+    max-width: none !important;
+    margin: 0 !important;
+    padding: 0 !important;
+    box-sizing: border-box !important;
+  }
+
+  @page {
+    size: 210mm 297mm;
+    margin: 16mm;
+  }
+}
+</style>

+ 80 - 2
src/views/elderly/contracts/explanation-examination-report-items/AddForm.vue

@@ -82,6 +82,9 @@
 
     <template #footer>
       <el-button @click="handleClosed">关闭</el-button>
+      <el-button type="success" size="small" v-show="isDetail" @click="handlePrint"
+        >打印/导出</el-button
+      >
       <el-button
         style="margin-left: 22px; margin-right: 30px"
         v-loading="formLoading"
@@ -92,13 +95,27 @@
       >
     </template>
   </el-drawer>
+
+  <Teleport to="body">
+    <div v-if="isPrint" class="print-container">
+      <div class="print-org-name">{{ orgName }}</div>
+      <ExplanationExaminationReportBody
+        v-model="examinationReportForm"
+        :is-text-mode="true"
+        :elder-id="dataForm.elderId"
+        :elder-name="dataForm.elderName"
+      />
+    </div>
+  </Teleport>
 </template>
 
 <script lang="ts" setup>
-import { ref, reactive } from 'vue'
+import { ref, reactive, computed, nextTick } from 'vue'
 
 import dayjs from 'dayjs'
 import ExplanationExaminationReportBody from '../components/ExplanationExaminationReportBody.vue'
+import { useUserStore } from '@/store/modules/user'
+import { findLabelById } from '@/utils/dict'
 
 import {
   explanationExaminationReport_create,
@@ -107,12 +124,20 @@ import {
 } from '@/api/elderly/contracts'
 const message = useMessage()
 const { t } = useI18n()
+const userStore = useUserStore()
 const title = ref('')
 const dialogVisible = ref(false)
+const formLoading = ref(false)
 const selectElderRef = ref()
 const bodyRef = ref()
 const isDetail = ref(false)
-const formLoading = ref(false)
+const isPrint = ref(false)
+const orgName = computed(
+  () =>
+    findLabelById(userStore.getOrgTenant?.options || [], dataForm.value.tenantId) ||
+    userStore.getTenantName ||
+    ''
+)
 let dataForm = ref({
   id: undefined,
   elderName: '',
@@ -245,6 +270,16 @@ const handleClosed = () => {
   dialogVisible.value = false
   resetForm()
 }
+
+const handlePrint = async () => {
+  isPrint.value = true
+  await nextTick()
+  await new Promise((resolve) => setTimeout(resolve, 1500))
+  window.print()
+  setTimeout(() => {
+    isPrint.value = false
+  }, 500)
+}
 </script>
 
 <style scoped lang="scss">
@@ -277,3 +312,46 @@ const handleClosed = () => {
   }
 }
 </style>
+
+<style lang="scss">
+.print-container {
+  display: none;
+}
+
+@media print {
+  html,
+  body {
+    background: #fff !important;
+    margin: 0 !important;
+    padding: 0 !important;
+    overflow: visible !important;
+  }
+
+  body > *:not(.print-container) {
+    display: none !important;
+  }
+
+  body > .print-container {
+    display: block !important;
+  }
+
+  .print-container .print-org-name {
+    text-align: start;
+    font-size: 14px;
+    margin-bottom: 12px;
+  }
+
+  .print-container > *:not(.print-org-name) {
+    width: 210mm !important;
+    max-width: none !important;
+    margin: 0 !important;
+    padding: 0 !important;
+    box-sizing: border-box !important;
+  }
+
+  @page {
+    size: 210mm 297mm;
+    margin: 16mm;
+  }
+}
+</style>

+ 75 - 2
src/views/elderly/contracts/first-service-project-confirmation/AddForm.vue

@@ -80,6 +80,9 @@
 
     <template #footer>
       <el-button @click="handleClosed">关闭</el-button>
+      <el-button type="success" size="small" v-show="isDetail" @click="handlePrint"
+        >打印/导出</el-button
+      >
       <el-button
         style="margin-left: 22px; margin-right: 30px"
         v-loading="formLoading"
@@ -90,13 +93,22 @@
       >
     </template>
   </el-drawer>
+
+  <Teleport to="body">
+    <div v-if="isPrint" class="print-container">
+      <div class="print-org-name">{{ orgName }}</div>
+      <FirstServiceProjectConfirmationBody v-model="firstServiceForm" :is-text-mode="true" />
+    </div>
+  </Teleport>
 </template>
 
 <script lang="ts" setup>
-import { ref, reactive } from 'vue'
+import { ref, reactive, computed, nextTick } from 'vue'
 
 import dayjs from 'dayjs'
 import FirstServiceProjectConfirmationBody from '../components/FirstServiceProjectConfirmationBody.vue'
+import { useUserStore } from '@/store/modules/user'
+import { findLabelById } from '@/utils/dict'
 
 import {
   firstServiceProjectConfirmation_create,
@@ -105,12 +117,20 @@ import {
 } from '@/api/elderly/contracts'
 const message = useMessage()
 const { t } = useI18n()
+const userStore = useUserStore()
 const title = ref('')
 const dialogVisible = ref(false)
+const formLoading = ref(false)
 const selectElderRef = ref()
 const bodyRef = ref()
 const isDetail = ref(false)
-const formLoading = ref(false)
+const isPrint = ref(false)
+const orgName = computed(
+  () =>
+    findLabelById(userStore.getOrgTenant?.options || [], dataForm.value.tenantId) ||
+    userStore.getTenantName ||
+    ''
+)
 let dataForm = ref({
   id: undefined,
   elderName: '',
@@ -274,6 +294,16 @@ const handleClosed = () => {
   dialogVisible.value = false
   resetForm()
 }
+
+const handlePrint = async () => {
+  isPrint.value = true
+  await nextTick()
+  await new Promise((resolve) => setTimeout(resolve, 1500))
+  window.print()
+  setTimeout(() => {
+    isPrint.value = false
+  }, 500)
+}
 </script>
 
 <style scoped lang="scss">
@@ -306,3 +336,46 @@ const handleClosed = () => {
   }
 }
 </style>
+
+<style lang="scss">
+.print-container {
+  display: none;
+}
+
+@media print {
+  html,
+  body {
+    background: #fff !important;
+    margin: 0 !important;
+    padding: 0 !important;
+    overflow: visible !important;
+  }
+
+  body > *:not(.print-container) {
+    display: none !important;
+  }
+
+  body > .print-container {
+    display: block !important;
+  }
+
+  .print-container .print-org-name {
+    text-align: start;
+    font-size: 14px;
+    margin-bottom: 12px;
+  }
+
+  .print-container > *:not(.print-org-name) {
+    width: 210mm !important;
+    max-width: none !important;
+    margin: 0 !important;
+    padding: 0 !important;
+    box-sizing: border-box !important;
+  }
+
+  @page {
+    size: 210mm 297mm;
+    margin: 16mm;
+  }
+}
+</style>

+ 80 - 2
src/views/elderly/contracts/guardian-party-b/AddForm.vue

@@ -82,6 +82,9 @@
 
     <template #footer>
       <el-button @click="handleClosed">关闭</el-button>
+      <el-button type="success" size="small" v-show="isDetail" @click="handlePrint"
+        >打印/导出</el-button
+      >
       <el-button
         style="margin-left: 22px; margin-right: 30px"
         v-loading="formLoading"
@@ -92,13 +95,27 @@
       >
     </template>
   </el-drawer>
+
+  <Teleport to="body">
+    <div v-if="isPrint" class="print-container">
+      <div class="print-org-name">{{ orgName }}</div>
+      <DocumentAttachmentBody
+        v-model="attachmentForm"
+        :is-text-mode="true"
+        title="乙方监护人(丙方)身份证、户口本复印件"
+        description="丙方:(系自然人的)有效身份证件复印件(正反面复印)及户口本复印件(户主页和本人页);(系单位的)的有效注册登登记材料复印件(加盖公章)、法定代表人/负责人及联系人的身份证件复印件(身份证件需正反面复印)"
+      />
+    </div>
+  </Teleport>
 </template>
 
 <script lang="ts" setup>
-import { ref, reactive } from 'vue'
+import { ref, reactive, computed, nextTick } from 'vue'
 
 import dayjs from 'dayjs'
 import DocumentAttachmentBody from '../components/DocumentAttachmentBody.vue'
+import { useUserStore } from '@/store/modules/user'
+import { findLabelById } from '@/utils/dict'
 
 import {
   guardianPartyB_create,
@@ -107,12 +124,20 @@ import {
 } from '@/api/elderly/contracts'
 const message = useMessage()
 const { t } = useI18n()
+const userStore = useUserStore()
 const title = ref('')
 const dialogVisible = ref(false)
+const formLoading = ref(false)
 const selectElderRef = ref()
 const bodyRef = ref()
 const isDetail = ref(false)
-const formLoading = ref(false)
+const isPrint = ref(false)
+const orgName = computed(
+  () =>
+    findLabelById(userStore.getOrgTenant?.options || [], dataForm.value.tenantId) ||
+    userStore.getTenantName ||
+    ''
+)
 let dataForm = ref({
   id: undefined,
   elderName: '',
@@ -245,6 +270,16 @@ const handleClosed = () => {
   dialogVisible.value = false
   resetForm()
 }
+
+const handlePrint = async () => {
+  isPrint.value = true
+  await nextTick()
+  await new Promise((resolve) => setTimeout(resolve, 1500))
+  window.print()
+  setTimeout(() => {
+    isPrint.value = false
+  }, 500)
+}
 </script>
 
 <style scoped lang="scss">
@@ -277,3 +312,46 @@ const handleClosed = () => {
   }
 }
 </style>
+
+<style lang="scss">
+.print-container {
+  display: none;
+}
+
+@media print {
+  html,
+  body {
+    background: #fff !important;
+    margin: 0 !important;
+    padding: 0 !important;
+    overflow: visible !important;
+  }
+
+  body > *:not(.print-container) {
+    display: none !important;
+  }
+
+  body > .print-container {
+    display: block !important;
+  }
+
+  .print-container .print-org-name {
+    text-align: start;
+    font-size: 14px;
+    margin-bottom: 12px;
+  }
+
+  .print-container > *:not(.print-org-name) {
+    width: 210mm !important;
+    max-width: none !important;
+    margin: 0 !important;
+    padding: 0 !important;
+    box-sizing: border-box !important;
+  }
+
+  @page {
+    size: 210mm 297mm;
+    margin: 16mm;
+  }
+}
+</style>

+ 83 - 2
src/views/elderly/contracts/identification-document-partyb/AddForm.vue

@@ -85,6 +85,9 @@
 
     <template #footer>
       <el-button @click="handleClosed">关闭</el-button>
+      <el-button type="success" size="small" v-show="isDetail" @click="handlePrint"
+        >打印/导出</el-button
+      >
       <el-button
         style="margin-left: 22px; margin-right: 30px"
         v-loading="formLoading"
@@ -95,13 +98,30 @@
       >
     </template>
   </el-drawer>
+
+  <Teleport to="body">
+    <div v-if="isPrint" class="print-container">
+      <div class="print-org-name">{{ orgName }}</div>
+      <DocumentAttachmentBody
+        v-model="attachmentForm"
+        :is-text-mode="true"
+        title="乙方有效证件"
+        description="乙方:有效身份证件复印件(正反面复印)及户口本复印件(户主页和本人页)"
+        :elder-id="dataForm.elderId"
+        :elder-name="dataForm.elderName"
+        fun-name="乙方有效证件"
+      />
+    </div>
+  </Teleport>
 </template>
 
 <script lang="ts" setup>
-import { ref, reactive } from 'vue'
+import { ref, reactive, computed, nextTick } from 'vue'
 
 import dayjs from 'dayjs'
 import DocumentAttachmentBody from '../components/DocumentAttachmentBody.vue'
+import { useUserStore } from '@/store/modules/user'
+import { findLabelById } from '@/utils/dict'
 
 import {
   partyBIdentificationDocument_create,
@@ -110,12 +130,20 @@ import {
 } from '@/api/elderly/contracts'
 const message = useMessage()
 const { t } = useI18n()
+const userStore = useUserStore()
 const title = ref('')
 const dialogVisible = ref(false)
+const formLoading = ref(false)
 const selectElderRef = ref()
 const bodyRef = ref()
 const isDetail = ref(false)
-const formLoading = ref(false)
+const isPrint = ref(false)
+const orgName = computed(
+  () =>
+    findLabelById(userStore.getOrgTenant?.options || [], dataForm.value.tenantId) ||
+    userStore.getTenantName ||
+    ''
+)
 let dataForm = ref({
   id: undefined,
   elderName: '',
@@ -248,6 +276,16 @@ const handleClosed = () => {
   dialogVisible.value = false
   resetForm()
 }
+
+const handlePrint = async () => {
+  isPrint.value = true
+  await nextTick()
+  await new Promise((resolve) => setTimeout(resolve, 1500))
+  window.print()
+  setTimeout(() => {
+    isPrint.value = false
+  }, 500)
+}
 </script>
 
 <style scoped lang="scss">
@@ -280,3 +318,46 @@ const handleClosed = () => {
   }
 }
 </style>
+
+<style lang="scss">
+.print-container {
+  display: none;
+}
+
+@media print {
+  html,
+  body {
+    background: #fff !important;
+    margin: 0 !important;
+    padding: 0 !important;
+    overflow: visible !important;
+  }
+
+  body > *:not(.print-container) {
+    display: none !important;
+  }
+
+  body > .print-container {
+    display: block !important;
+  }
+
+  .print-container .print-org-name {
+    text-align: start;
+    font-size: 14px;
+    margin-bottom: 12px;
+  }
+
+  .print-container > *:not(.print-org-name) {
+    width: 210mm !important;
+    max-width: none !important;
+    margin: 0 !important;
+    padding: 0 !important;
+    box-sizing: border-box !important;
+  }
+
+  @page {
+    size: 210mm 297mm;
+    margin: 16mm;
+  }
+}
+</style>

+ 80 - 3
src/views/elderly/contracts/outing-confirmation-form/AddForm.vue

@@ -70,12 +70,19 @@
 
       <!-- 内容区域 -->
       <div class="form-body">
-        <OutingConfirmationBody ref="bodyRef" v-model="outingConfirmationForm" :is-text-mode="isDetail" />
+        <OutingConfirmationBody
+          ref="bodyRef"
+          v-model="outingConfirmationForm"
+          :is-text-mode="isDetail"
+        />
       </div>
     </div>
 
     <template #footer>
       <el-button @click="handleClosed">关闭</el-button>
+      <el-button type="success" size="small" v-show="isDetail" @click="handlePrint"
+        >打印/导出</el-button
+      >
       <el-button
         style="margin-left: 22px; margin-right: 30px"
         v-loading="formLoading"
@@ -86,13 +93,22 @@
       >
     </template>
   </el-drawer>
+
+  <Teleport to="body">
+    <div v-if="isPrint" class="print-container">
+      <div class="print-org-name">{{ orgName }}</div>
+      <OutingConfirmationBody v-model="outingConfirmationForm" :is-text-mode="true" />
+    </div>
+  </Teleport>
 </template>
 
 <script lang="ts" setup>
-import { ref, reactive } from 'vue'
+import { ref, reactive, computed, nextTick } from 'vue'
 
 import dayjs from 'dayjs'
 import OutingConfirmationBody from '../components/OutingConfirmationBody.vue'
+import { useUserStore } from '@/store/modules/user'
+import { findLabelById } from '@/utils/dict'
 
 import {
   outingConfirmation_create,
@@ -101,12 +117,20 @@ import {
 } from '@/api/elderly/contracts'
 const message = useMessage()
 const { t } = useI18n()
+const userStore = useUserStore()
 const title = ref('')
 const dialogVisible = ref(false)
+const formLoading = ref(false)
 const selectElderRef = ref()
 const bodyRef = ref()
 const isDetail = ref(false)
-const formLoading = ref(false)
+const isPrint = ref(false)
+const orgName = computed(
+  () =>
+    findLabelById(userStore.getOrgTenant?.options || [], dataForm.value.tenantId) ||
+    userStore.getTenantName ||
+    ''
+)
 let dataForm = ref({
   id: undefined,
   elderName: '',
@@ -245,6 +269,16 @@ const handleClosed = () => {
   dialogVisible.value = false
   resetForm()
 }
+
+const handlePrint = async () => {
+  isPrint.value = true
+  await nextTick()
+  await new Promise((resolve) => setTimeout(resolve, 1500))
+  window.print()
+  setTimeout(() => {
+    isPrint.value = false
+  }, 500)
+}
 </script>
 
 <style scoped lang="scss">
@@ -277,3 +311,46 @@ const handleClosed = () => {
   }
 }
 </style>
+
+<style lang="scss">
+.print-container {
+  display: none;
+}
+
+@media print {
+  html,
+  body {
+    background: #fff !important;
+    margin: 0 !important;
+    padding: 0 !important;
+    overflow: visible !important;
+  }
+
+  body > *:not(.print-container) {
+    display: none !important;
+  }
+
+  body > .print-container {
+    display: block !important;
+  }
+
+  .print-container .print-org-name {
+    text-align: start;
+    font-size: 14px;
+    margin-bottom: 12px;
+  }
+
+  .print-container > *:not(.print-org-name) {
+    width: 210mm !important;
+    max-width: none !important;
+    margin: 0 !important;
+    padding: 0 !important;
+    box-sizing: border-box !important;
+  }
+
+  @page {
+    size: 210mm 297mm;
+    margin: 16mm;
+  }
+}
+</style>

+ 76 - 3
src/views/elderly/contracts/power-of-attorney/AddForm.vue

@@ -76,6 +76,9 @@
 
     <template #footer>
       <el-button @click="handleClosed">关闭</el-button>
+      <el-button type="success" size="small" v-show="isDetail" @click="handlePrint"
+        >打印/导出</el-button
+      >
       <el-button
         style="margin-left: 22px; margin-right: 30px"
         v-loading="formLoading"
@@ -86,13 +89,22 @@
       >
     </template>
   </el-drawer>
+
+  <Teleport to="body">
+    <div v-if="isPrint" class="print-container">
+      <div class="print-org-name">{{ orgName }}</div>
+      <PowerOfAttorneyBody v-model="powerOfAttorneyForm" :is-text-mode="true" />
+    </div>
+  </Teleport>
 </template>
 
 <script lang="ts" setup>
-import { ref, reactive } from 'vue'
+import { ref, reactive, computed, nextTick } from 'vue'
 
 import dayjs from 'dayjs'
 import PowerOfAttorneyBody from '../components/PowerOfAttorneyBody.vue'
+import { useUserStore } from '@/store/modules/user'
+import { findLabelById } from '@/utils/dict'
 
 import {
   powerOfAttorney_create,
@@ -101,12 +113,20 @@ import {
 } from '@/api/elderly/contracts'
 const message = useMessage()
 const { t } = useI18n()
+const userStore = useUserStore()
 const title = ref('')
 const dialogVisible = ref(false)
+const formLoading = ref(false)
 const selectElderRef = ref()
 const bodyRef = ref()
 const isDetail = ref(false)
-const formLoading = ref(false)
+const isPrint = ref(false)
+const orgName = computed(
+  () =>
+    findLabelById(userStore.getOrgTenant?.options || [], dataForm.value.tenantId) ||
+    userStore.getTenantName ||
+    ''
+)
 let dataForm = ref({
   id: undefined,
   elderName: '',
@@ -124,7 +144,7 @@ const elderUp = (e) => {
   dataForm.value.checkInTime = e.checkInTime
   dataForm.value.contractNumber = e.contractNumber || e.fileNumber
   powerOfAttorneyForm.value.elderName = e.elderName
-  powerOfAttorneyForm.value.principalGender = (e.elderSex == 1 ? '男' :e.elderSex == 2? '女':'')
+  powerOfAttorneyForm.value.principalGender = e.elderSex == 1 ? '男' : e.elderSex == 2 ? '女' : ''
   powerOfAttorneyForm.value.principalIdCardNo = e.idCard
 }
 
@@ -263,6 +283,16 @@ const handleClosed = () => {
   dialogVisible.value = false
   resetForm()
 }
+
+const handlePrint = async () => {
+  isPrint.value = true
+  await nextTick()
+  await new Promise((resolve) => setTimeout(resolve, 1500))
+  window.print()
+  setTimeout(() => {
+    isPrint.value = false
+  }, 500)
+}
 </script>
 
 <style scoped lang="scss">
@@ -295,3 +325,46 @@ const handleClosed = () => {
   }
 }
 </style>
+
+<style lang="scss">
+.print-container {
+  display: none;
+}
+
+@media print {
+  html,
+  body {
+    background: #fff !important;
+    margin: 0 !important;
+    padding: 0 !important;
+    overflow: visible !important;
+  }
+
+  body > *:not(.print-container) {
+    display: none !important;
+  }
+
+  body > .print-container {
+    display: block !important;
+  }
+
+  .print-container .print-org-name {
+    text-align: start;
+    font-size: 14px;
+    margin-bottom: 12px;
+  }
+
+  .print-container > *:not(.print-org-name) {
+    width: 210mm !important;
+    max-width: none !important;
+    margin: 0 !important;
+    padding: 0 !important;
+    box-sizing: border-box !important;
+  }
+
+  @page {
+    size: 210mm 297mm;
+    margin: 16mm;
+  }
+}
+</style>

+ 79 - 2
src/views/elderly/contracts/registration-certificate-civil-affairs-department/AddForm.vue

@@ -81,6 +81,9 @@
 
     <template #footer>
       <el-button @click="handleClosed">关闭</el-button>
+      <el-button type="success" size="small" v-show="isDetail" @click="handlePrint"
+        >打印/导出</el-button
+      >
       <el-button
         style="margin-left: 22px; margin-right: 30px"
         v-loading="formLoading"
@@ -91,13 +94,26 @@
       >
     </template>
   </el-drawer>
+
+  <Teleport to="body">
+    <div v-if="isPrint" class="print-container">
+      <div class="print-org-name">{{ orgName }}</div>
+      <DocumentAttachmentBody
+        v-model="attachmentForm"
+        :is-text-mode="true"
+        description="甲方登记证书及民政部门备案回执"
+      />
+    </div>
+  </Teleport>
 </template>
 
 <script lang="ts" setup>
-import { ref, reactive } from 'vue'
+import { ref, reactive, computed, nextTick } from 'vue'
 
 import dayjs from 'dayjs'
 import DocumentAttachmentBody from '../components/DocumentAttachmentBody.vue'
+import { useUserStore } from '@/store/modules/user'
+import { findLabelById } from '@/utils/dict'
 
 import {
   registrationCertificateCivilAffairs_create,
@@ -106,12 +122,20 @@ import {
 } from '@/api/elderly/contracts'
 const message = useMessage()
 const { t } = useI18n()
+const userStore = useUserStore()
 const title = ref('')
 const dialogVisible = ref(false)
+const formLoading = ref(false)
 const selectElderRef = ref()
 const bodyRef = ref()
 const isDetail = ref(false)
-const formLoading = ref(false)
+const isPrint = ref(false)
+const orgName = computed(
+  () =>
+    findLabelById(userStore.getOrgTenant?.options || [], dataForm.value.tenantId) ||
+    userStore.getTenantName ||
+    ''
+)
 let dataForm = ref({
   id: undefined,
   elderName: '',
@@ -244,6 +268,16 @@ const handleClosed = () => {
   dialogVisible.value = false
   resetForm()
 }
+
+const handlePrint = async () => {
+  isPrint.value = true
+  await nextTick()
+  await new Promise((resolve) => setTimeout(resolve, 1500))
+  window.print()
+  setTimeout(() => {
+    isPrint.value = false
+  }, 500)
+}
 </script>
 
 <style scoped lang="scss">
@@ -276,3 +310,46 @@ const handleClosed = () => {
   }
 }
 </style>
+
+<style lang="scss">
+.print-container {
+  display: none;
+}
+
+@media print {
+  html,
+  body {
+    background: #fff !important;
+    margin: 0 !important;
+    padding: 0 !important;
+    overflow: visible !important;
+  }
+
+  body > *:not(.print-container) {
+    display: none !important;
+  }
+
+  body > .print-container {
+    display: block !important;
+  }
+
+  .print-container .print-org-name {
+    text-align: start;
+    font-size: 14px;
+    margin-bottom: 12px;
+  }
+
+  .print-container > *:not(.print-org-name) {
+    width: 210mm !important;
+    max-width: none !important;
+    margin: 0 !important;
+    padding: 0 !important;
+    box-sizing: border-box !important;
+  }
+
+  @page {
+    size: 210mm 297mm;
+    margin: 16mm;
+  }
+}
+</style>

+ 75 - 2
src/views/elderly/contracts/risk-disclosure-statement/AddForm.vue

@@ -76,6 +76,9 @@
 
     <template #footer>
       <el-button @click="handleClosed">关闭</el-button>
+      <el-button type="success" size="small" v-show="isDetail" @click="handlePrint"
+        >打印/导出</el-button
+      >
       <el-button
         style="margin-left: 22px; margin-right: 30px"
         v-loading="formLoading"
@@ -86,13 +89,22 @@
       >
     </template>
   </el-drawer>
+
+  <Teleport to="body">
+    <div v-if="isPrint" class="print-container">
+      <div class="print-org-name">{{ orgName }}</div>
+      <RiskDisclosureBody v-model="riskDisclosureForm" :is-text-mode="true" />
+    </div>
+  </Teleport>
 </template>
 
 <script lang="ts" setup>
-import { ref, reactive } from 'vue'
+import { ref, reactive, computed, nextTick } from 'vue'
 
 import dayjs from 'dayjs'
 import RiskDisclosureBody from '../components/RiskDisclosureBody.vue'
+import { useUserStore } from '@/store/modules/user'
+import { findLabelById } from '@/utils/dict'
 
 import {
   extra_riskDisclosure_create,
@@ -101,12 +113,20 @@ import {
 } from '@/api/elderly/contracts'
 const message = useMessage()
 const { t } = useI18n()
+const userStore = useUserStore()
 const title = ref('')
 const dialogVisible = ref(false)
+const formLoading = ref(false)
 const selectElderRef = ref()
 const bodyRef = ref()
 const isDetail = ref(false)
-const formLoading = ref(false)
+const isPrint = ref(false)
+const orgName = computed(
+  () =>
+    findLabelById(userStore.getOrgTenant?.options || [], dataForm.value.tenantId) ||
+    userStore.getTenantName ||
+    ''
+)
 let dataForm = ref({
   id: undefined,
   elderName: '',
@@ -251,6 +271,16 @@ const handleClosed = () => {
   dialogVisible.value = false
   resetForm()
 }
+
+const handlePrint = async () => {
+  isPrint.value = true
+  await nextTick()
+  await new Promise((resolve) => setTimeout(resolve, 1500))
+  window.print()
+  setTimeout(() => {
+    isPrint.value = false
+  }, 500)
+}
 </script>
 
 <style scoped lang="scss">
@@ -283,3 +313,46 @@ const handleClosed = () => {
   }
 }
 </style>
+
+<style lang="scss">
+.print-container {
+  display: none;
+}
+
+@media print {
+  html,
+  body {
+    background: #fff !important;
+    margin: 0 !important;
+    padding: 0 !important;
+    overflow: visible !important;
+  }
+
+  body > *:not(.print-container) {
+    display: none !important;
+  }
+
+  body > .print-container {
+    display: block !important;
+  }
+
+  .print-container .print-org-name {
+    text-align: start;
+    font-size: 14px;
+    margin-bottom: 12px;
+  }
+
+  .print-container > *:not(.print-org-name) {
+    width: 210mm !important;
+    max-width: none !important;
+    margin: 0 !important;
+    padding: 0 !important;
+    box-sizing: border-box !important;
+  }
+
+  @page {
+    size: 210mm 297mm;
+    margin: 16mm;
+  }
+}
+</style>

+ 77 - 4
src/views/elderly/contracts/room-facilities-equipment/AddForm.vue

@@ -80,6 +80,9 @@
 
     <template #footer>
       <el-button @click="handleClosed">关闭</el-button>
+      <el-button type="success" size="small" v-show="isDetail" @click="handlePrint"
+        >打印/导出</el-button
+      >
       <el-button
         style="margin-left: 22px; margin-right: 30px"
         v-loading="formLoading"
@@ -90,13 +93,22 @@
       >
     </template>
   </el-drawer>
+
+  <Teleport to="body">
+    <div v-if="isPrint" class="print-container">
+      <div class="print-org-name">{{ orgName }}</div>
+      <RoomFacilitiesEquipmentBody v-model="roomFacilitiesForm" :is-text-mode="true" />
+    </div>
+  </Teleport>
 </template>
 
 <script lang="ts" setup>
-import { ref, reactive } from 'vue'
+import { ref, reactive, computed, nextTick } from 'vue'
 
 import dayjs from 'dayjs'
 import RoomFacilitiesEquipmentBody from '../components/RoomFacilitiesEquipmentBody.vue'
+import { useUserStore } from '@/store/modules/user'
+import { findLabelById } from '@/utils/dict'
 
 import {
   roomFacilitiesEquipment_create,
@@ -105,12 +117,20 @@ import {
 } from '@/api/elderly/contracts'
 const message = useMessage()
 const { t } = useI18n()
+const userStore = useUserStore()
 const title = ref('')
 const dialogVisible = ref(false)
+const formLoading = ref(false)
 const selectElderRef = ref()
 const bodyRef = ref()
 const isDetail = ref(false)
-const formLoading = ref(false)
+const isPrint = ref(false)
+const orgName = computed(
+  () =>
+    findLabelById(userStore.getOrgTenant?.options || [], dataForm.value.tenantId) ||
+    userStore.getTenantName ||
+    ''
+)
 let dataForm = ref({
   id: undefined,
   elderName: '',
@@ -127,8 +147,8 @@ const elderUp = (e) => {
   dataForm.value.bedNumber = e.bedName || ''
   dataForm.value.checkInTime = e.checkInTime
   dataForm.value.contractNumber = e.contractNumber || e.fileNumber
-  roomFacilitiesForm.value.elderName = e.elderName||''
-  roomFacilitiesForm.value.roomNo = e.bedName||''
+  roomFacilitiesForm.value.elderName = e.elderName || ''
+  roomFacilitiesForm.value.roomNo = e.bedName || ''
 }
 
 const roomFacilitiesForm = ref({
@@ -256,6 +276,16 @@ const handleClosed = () => {
   dialogVisible.value = false
   resetForm()
 }
+
+const handlePrint = async () => {
+  isPrint.value = true
+  await nextTick()
+  await new Promise((resolve) => setTimeout(resolve, 1500))
+  window.print()
+  setTimeout(() => {
+    isPrint.value = false
+  }, 500)
+}
 </script>
 
 <style scoped lang="scss">
@@ -288,3 +318,46 @@ const handleClosed = () => {
   }
 }
 </style>
+
+<style lang="scss">
+.print-container {
+  display: none;
+}
+
+@media print {
+  html,
+  body {
+    background: #fff !important;
+    margin: 0 !important;
+    padding: 0 !important;
+    overflow: visible !important;
+  }
+
+  body > *:not(.print-container) {
+    display: none !important;
+  }
+
+  body > .print-container {
+    display: block !important;
+  }
+
+  .print-container .print-org-name {
+    text-align: start;
+    font-size: 14px;
+    margin-bottom: 12px;
+  }
+
+  .print-container > *:not(.print-org-name) {
+    width: 210mm !important;
+    max-width: none !important;
+    margin: 0 !important;
+    padding: 0 !important;
+    box-sizing: border-box !important;
+  }
+
+  @page {
+    size: 210mm 297mm;
+    margin: 16mm;
+  }
+}
+</style>

+ 80 - 3
src/views/elderly/contracts/service-charging-standards-institution/AddForm.vue

@@ -70,12 +70,19 @@
 
       <!-- 内容区域 -->
       <div class="form-body">
-        <ServiceChargingStandardsBody ref="bodyRef" v-model="serviceChargingForm" :is-text-mode="isDetail" />
+        <ServiceChargingStandardsBody
+          ref="bodyRef"
+          v-model="serviceChargingForm"
+          :is-text-mode="isDetail"
+        />
       </div>
     </div>
 
     <template #footer>
       <el-button @click="handleClosed">关闭</el-button>
+      <el-button type="success" size="small" v-show="isDetail" @click="handlePrint"
+        >打印/导出</el-button
+      >
       <el-button
         style="margin-left: 22px; margin-right: 30px"
         v-loading="formLoading"
@@ -86,13 +93,22 @@
       >
     </template>
   </el-drawer>
+
+  <Teleport to="body">
+    <div v-if="isPrint" class="print-container">
+      <div class="print-org-name">{{ orgName }}</div>
+      <ServiceChargingStandardsBody v-model="serviceChargingForm" :is-text-mode="true" />
+    </div>
+  </Teleport>
 </template>
 
 <script lang="ts" setup>
-import { ref, reactive } from 'vue'
+import { ref, reactive, computed, nextTick } from 'vue'
 
 import dayjs from 'dayjs'
 import ServiceChargingStandardsBody from '../components/ServiceChargingStandardsBody.vue'
+import { useUserStore } from '@/store/modules/user'
+import { findLabelById } from '@/utils/dict'
 
 import {
   serviceChargingStandards_create,
@@ -101,12 +117,20 @@ import {
 } from '@/api/elderly/contracts'
 const message = useMessage()
 const { t } = useI18n()
+const userStore = useUserStore()
 const title = ref('')
 const dialogVisible = ref(false)
+const formLoading = ref(false)
 const selectElderRef = ref()
 const bodyRef = ref()
 const isDetail = ref(false)
-const formLoading = ref(false)
+const isPrint = ref(false)
+const orgName = computed(
+  () =>
+    findLabelById(userStore.getOrgTenant?.options || [], dataForm.value.tenantId) ||
+    userStore.getTenantName ||
+    ''
+)
 let dataForm = ref({
   id: undefined,
   elderName: '',
@@ -241,6 +265,16 @@ const handleClosed = () => {
   dialogVisible.value = false
   resetForm()
 }
+
+const handlePrint = async () => {
+  isPrint.value = true
+  await nextTick()
+  await new Promise((resolve) => setTimeout(resolve, 1500))
+  window.print()
+  setTimeout(() => {
+    isPrint.value = false
+  }, 500)
+}
 </script>
 
 <style scoped lang="scss">
@@ -273,3 +307,46 @@ const handleClosed = () => {
   }
 }
 </style>
+
+<style lang="scss">
+.print-container {
+  display: none;
+}
+
+@media print {
+  html,
+  body {
+    background: #fff !important;
+    margin: 0 !important;
+    padding: 0 !important;
+    overflow: visible !important;
+  }
+
+  body > *:not(.print-container) {
+    display: none !important;
+  }
+
+  body > .print-container {
+    display: block !important;
+  }
+
+  .print-container .print-org-name {
+    text-align: start;
+    font-size: 14px;
+    margin-bottom: 12px;
+  }
+
+  .print-container > *:not(.print-org-name) {
+    width: 210mm !important;
+    max-width: none !important;
+    margin: 0 !important;
+    padding: 0 !important;
+    box-sizing: border-box !important;
+  }
+
+  @page {
+    size: 210mm 297mm;
+    margin: 16mm;
+  }
+}
+</style>

+ 80 - 3
src/views/elderly/contracts/signature-proxy-application/AddForm.vue

@@ -70,12 +70,19 @@
 
       <!-- 内容区域 -->
       <div class="form-body">
-        <SignatureProxyApplicationBody ref="bodyRef" v-model="signatureProxyForm" :is-text-mode="isDetail" />
+        <SignatureProxyApplicationBody
+          ref="bodyRef"
+          v-model="signatureProxyForm"
+          :is-text-mode="isDetail"
+        />
       </div>
     </div>
 
     <template #footer>
       <el-button @click="handleClosed">关闭</el-button>
+      <el-button type="success" size="small" v-show="isDetail" @click="handlePrint"
+        >打印/导出</el-button
+      >
       <el-button
         style="margin-left: 22px; margin-right: 30px"
         v-loading="formLoading"
@@ -86,13 +93,22 @@
       >
     </template>
   </el-drawer>
+
+  <Teleport to="body">
+    <div v-if="isPrint" class="print-container">
+      <div class="print-org-name">{{ orgName }}</div>
+      <SignatureProxyApplicationBody v-model="signatureProxyForm" :is-text-mode="true" />
+    </div>
+  </Teleport>
 </template>
 
 <script lang="ts" setup>
-import { ref, reactive } from 'vue'
+import { ref, reactive, computed, nextTick } from 'vue'
 
 import dayjs from 'dayjs'
 import SignatureProxyApplicationBody from '../components/SignatureProxyApplicationBody.vue'
+import { useUserStore } from '@/store/modules/user'
+import { findLabelById } from '@/utils/dict'
 
 import {
   signatureProxyApplication_create,
@@ -101,12 +117,20 @@ import {
 } from '@/api/elderly/contracts'
 const message = useMessage()
 const { t } = useI18n()
+const userStore = useUserStore()
 const title = ref('')
 const dialogVisible = ref(false)
+const formLoading = ref(false)
 const selectElderRef = ref()
 const bodyRef = ref()
 const isDetail = ref(false)
-const formLoading = ref(false)
+const isPrint = ref(false)
+const orgName = computed(
+  () =>
+    findLabelById(userStore.getOrgTenant?.options || [], dataForm.value.tenantId) ||
+    userStore.getTenantName ||
+    ''
+)
 let dataForm = ref({
   id: undefined,
   elderName: '',
@@ -252,6 +276,16 @@ const handleClosed = () => {
   dialogVisible.value = false
   resetForm()
 }
+
+const handlePrint = async () => {
+  isPrint.value = true
+  await nextTick()
+  await new Promise((resolve) => setTimeout(resolve, 1500))
+  window.print()
+  setTimeout(() => {
+    isPrint.value = false
+  }, 500)
+}
 </script>
 
 <style scoped lang="scss">
@@ -284,3 +318,46 @@ const handleClosed = () => {
   }
 }
 </style>
+
+<style lang="scss">
+.print-container {
+  display: none;
+}
+
+@media print {
+  html,
+  body {
+    background: #fff !important;
+    margin: 0 !important;
+    padding: 0 !important;
+    overflow: visible !important;
+  }
+
+  body > *:not(.print-container) {
+    display: none !important;
+  }
+
+  body > .print-container {
+    display: block !important;
+  }
+
+  .print-container .print-org-name {
+    text-align: start;
+    font-size: 14px;
+    margin-bottom: 12px;
+  }
+
+  .print-container > *:not(.print-org-name) {
+    width: 210mm !important;
+    max-width: none !important;
+    margin: 0 !important;
+    padding: 0 !important;
+    box-sizing: border-box !important;
+  }
+
+  @page {
+    size: 210mm 297mm;
+    margin: 16mm;
+  }
+}
+</style>

+ 60 - 47
src/views/elderly/elder/family-appointment/time-setting/index.vue

@@ -299,41 +299,33 @@
         </el-col>
 
         <el-col :span="12" class="col-right">
-<!--          <div class="card card-mid-right">-->
-<!--            <div class="card-header">-->
-<!--              <el-icon class="card-icon icon-green"><Tickets /></el-icon>-->
-<!--              <span class="card-title">总名额限制(按自然周和月)</span>-->
-<!--              <el-button-->
-<!--                type="primary"-->
-<!--                size="small"-->
-<!--                :disabled="isDisabled || totalLimits.length >= 3"-->
-<!--                @click="openTotalLimitDialog"-->
-<!--              >-->
-<!--                <el-icon><Plus /></el-icon>-->
-<!--                添加-->
-<!--              </el-button>-->
-<!--            </div>-->
-<!--            <div class="card-body card-body-limit">-->
-<!--              <div v-if="totalLimits.length === 0" class="empty-limits-inline">-->
-<!--                <el-empty description="暂无限制,点击右上角添加" :image-size="40" />-->
-<!--              </div>-->
-<!--              <div v-else class="limit-list-inline">-->
-<!--                <div v-for="(limit, index) in totalLimits" :key="index" class="limit-item-inline">-->
-<!--                  <span class="limit-type-badge">{{ getLimitTypeLabel(limit.type) }}</span>-->
-<!--                  <span class="limit-count-num">{{ limit.count }} <em>次</em></span>-->
-<!--                  <el-button-->
-<!--                    type="danger"-->
-<!--                    link-->
-<!--                    size="small"-->
-<!--                    :disabled="isDisabled"-->
-<!--                    @click="removeTotalLimit(index)"-->
-<!--                  >-->
-<!--                    <el-icon><Delete /></el-icon>-->
-<!--                  </el-button>-->
-<!--                </div>-->
-<!--              </div>-->
-<!--            </div>-->
-<!--          </div>-->
+          <div class="card card-mid-right">
+            <div class="card-header">
+              <el-icon class="card-icon icon-green"><Tickets /></el-icon>
+              <span class="card-title">放号时间段(每天可开始预约时间)</span>
+            </div>
+            <div class="card-body card-body-limit" style="padding: 40px 30px">
+              <span class="field-label">放号开始时间:</span>
+              <el-time-picker
+                v-model="formData.startTime"
+                format="HH:mm"
+                value-format="HH:mm"
+                placeholder="开始时间"
+                style="width: 150px"
+                :disabled="isDisabled"
+              />
+
+              <span class="field-label" style="margin-left: 3vw">放号结束时间:</span>
+              <el-time-picker
+                v-model="formData.endTime"
+                format="HH:mm"
+                value-format="HH:mm"
+                placeholder="结束时间"
+                style="width: 150px"
+                :disabled="isDisabled"
+              />
+            </div>
+          </div>
 
           <div class="card card-bottom-right">
             <div class="card-header">
@@ -667,6 +659,8 @@ const defaultFormData = () => ({
   ruleType: 1,
   startDay: 0,
   advanceDays: 6,
+  startTime: '08:00',
+  endTime: '17:30',
   appointmentEnabled: true
 })
 
@@ -1005,11 +999,22 @@ const getSetting = async () => {
     if (res && res.config) {
       const config = res.config
       configId.value = config.id
+      let startTime = defaultFormData().startTime
+      let endTime = defaultFormData().endTime
+      if (config.openTimeSlot && typeof config.openTimeSlot === 'string') {
+        const [s, e] = config.openTimeSlot.split('-')
+        if (s && e) {
+          startTime = s
+          endTime = e
+        }
+      }
       Object.assign(formData, {
         ruleType: 1,
         startDay: config.beginBookDays ?? 0,
         advanceDays: config.advanceDays ?? 0,
-        appointmentEnabled: config.enabled === 1
+        appointmentEnabled: config.enabled === 1,
+        startTime,
+        endTime
       })
       totalLimits.value = []
       personLimits.value = []
@@ -1164,6 +1169,14 @@ const handleSubmit = async () => {
     await ElMessageBox.alert('提前预约天数最少为1', '警告', { type: 'warning' })
     return
   }
+  if (
+    formData.startTime &&
+    formData.endTime &&
+    timeToMinutes(formData.startTime) >= timeToMinutes(formData.endTime)
+  ) {
+    await ElMessageBox.alert('放号开始时间不能晚于或等于结束时间', '警告', { type: 'warning' })
+    return
+  }
   const groupError = validateGroups()
   if (groupError) {
     await ElMessageBox.alert(groupError, '警告', { type: 'warning' })
@@ -1186,20 +1199,16 @@ const handleSubmit = async () => {
         item.endTime &&
         timeToMinutes(item.startTime) >= timeToMinutes(item.endTime)
       ) {
-        await ElMessageBox.alert(
-          '存在开始时间晚于或等于结束时间的预约项,请检查',
-          '警告',
-          { type: 'warning' }
-        )
+        await ElMessageBox.alert('存在开始时间晚于或等于结束时间的预约项,请检查', '警告', {
+          type: 'warning'
+        })
         return
       }
       for (let j = i + 1; j < group.items.length; j++) {
         if (isOverlap(item, group.items[j])) {
-          await ElMessageBox.alert(
-            '同一预约组内存在时间段重叠的预约项,请检查',
-            '警告',
-            { type: 'warning' }
-          )
+          await ElMessageBox.alert('同一预约组内存在时间段重叠的预约项,请检查', '警告', {
+            type: 'warning'
+          })
           return
         }
       }
@@ -1213,7 +1222,11 @@ const handleSubmit = async () => {
       tenantId: organizationId,
       advanceDays: formData.advanceDays,
       beginBookDays: formData.startDay,
-      enabled: formData.appointmentEnabled ? 1 : 0
+      enabled: formData.appointmentEnabled ? 1 : 0,
+      openTimeSlot:
+        formData.startTime && formData.endTime
+          ? `${formData.startTime}-${formData.endTime}`
+          : undefined
     }
     totalLimits.value.forEach((limit) => {
       const field = limitTypeToFieldMap[limit.type]

+ 70 - 60
src/views/social-worker/assessment/PerceptionAndCommunication/index.vue

@@ -43,7 +43,9 @@
       </el-form-item>
 
       <el-form-item>
-        <el-button @click="handleQuery" style="margin-left: 2vw"><Icon icon="ep:search" class="mr-5px" /> 搜索</el-button>
+        <el-button @click="handleQuery" style="margin-left: 2vw"
+          ><Icon icon="ep:search" class="mr-5px" /> 搜索</el-button
+        >
         <el-button @click="resetQuery"><Icon icon="ep:refresh" class="mr-5px" /> 重置</el-button>
       </el-form-item>
     </el-form>
@@ -52,12 +54,9 @@
   <!-- 列表 -->
   <ContentWrap>
     <div class="mb-10px">
-
-      <ButtonAdd @click="openForm(undefined)"  />
+      <ButtonAdd @click="openForm(undefined)" />
       <!--      <el-button @click="inputH" type="success"><Icon icon="fa:cloud-upload" :size="16" class="mr-1"/>导入</el-button>-->
-<!--      <ButtonImport @click="handleImportCard"  />-->
-
-
+      <!--      <ButtonImport @click="handleImportCard"  />-->
     </div>
     <el-table v-loading="loading" :data="list" :header-cell-style="tableHeaderColor">
       <el-table-column header-align="center" align="center" label="序号" width="60">
@@ -68,37 +67,57 @@
         </template>
       </el-table-column>
 
-
-      <el-table-column prop="elderName" header-align="center" align="center" label="长者姓名" min-width="150" show-overflow-tooltip/>
-      <el-table-column prop="assessor" header-align="center" align="center" label="评估人" min-width="200" show-overflow-tooltip/>
-      <el-table-column prop="assessDate" header-align="center" align="center" label="记录日期" min-width="200" show-overflow-tooltip/>
-
-      <el-table-column prop="creator" header-align="center" align="center" label="记录人" min-width="200" show-overflow-tooltip/>
-
-
-      <el-table-column label="操作" align="center" width="200" >
+      <el-table-column
+        prop="elderName"
+        header-align="center"
+        align="center"
+        label="长者姓名"
+        min-width="150"
+        show-overflow-tooltip
+      />
+      <el-table-column
+        prop="bedName"
+        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
+        prop="creator"
+        header-align="center"
+        align="center"
+        label="记录人"
+        min-width="200"
+        show-overflow-tooltip
+      />
+
+      <el-table-column label="操作" align="center" width="200">
         <template #default="scope">
-          <el-button
-            link
-            type="primary"
-            @click="openFormEdit(scope.row, scope.row.id)"
-          >
+          <el-button link type="primary" @click="openFormEdit(scope.row, scope.row.id)">
             编辑
           </el-button>
-          <el-button
-            link
-            type="warning"
-            @click="openFormDetail(scope.row,scope.row.id)"
-          >
+          <el-button link type="warning" @click="openFormDetail(scope.row, scope.row.id)">
             详情
           </el-button>
-          <el-button
-            link
-            type="danger"
-            @click="openClose(scope.row)"
-          >
-            删除
-          </el-button>
+          <el-button link type="danger" @click="openClose(scope.row)"> 删除 </el-button>
         </template>
       </el-table-column>
     </el-table>
@@ -130,7 +149,6 @@
     @cancel="showBatchExport = false"
   />
 
-
   <Import
     ref="importRef"
     @success="getList"
@@ -139,21 +157,20 @@
       downloadUrl: 'elderly-service-order/get-import-template',
       excelTempName: '居家工单-【导入】模板',
       importUrl: '/elderly-service-order/import',
-      failExportUrl: '',
+      failExportUrl: ''
     }"
   />
-
 </template>
 
 <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 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 {perceptionDelete, perceptionPage} from "@/api/social-work";
+import { formatTimestamp, getCurrentMonthRange } from '@/utils/dateUtil'
+import Import from '@/components/ImportFile/index.vue'
+import { restraintCreatePage, restraintDelete } from '@/api/elderly/nursing/keep-fit'
+import { perceptionDelete, perceptionPage } from '@/api/social-work'
 const message = useMessage() // 消息弹窗
 const { t } = useI18n() // 国际化
 const userStore = useUserStore()
@@ -192,14 +209,13 @@ const inputH = () => {
 }
 // 打开导出弹窗
 const handleImportCard = async () => {
-
   // showBatchExport.value = true
 }
 
 // 处理批量导出
 const handleBatchExport = async (batch: number, count: number) => {
   exportLoading.value = true
-  console.log(batch,count)
+  console.log(batch, count)
   // try {
   //   let queryParams = {
   //     pageNo: batch,
@@ -221,7 +237,6 @@ const handleBatchExport = async (batch: number, count: number) => {
   //   ]
   //   exportWithExpandedObjectArrays(list, headers, `医疗护理记录${formatToDateTime()}.xlsx`, '医疗护理记录')
   // } catch (_) {}
-
 }
 
 /** 查询列表 */
@@ -251,7 +266,7 @@ const resetQuery = () => {
   queryParams.elderName = ''
   queryParams.assessor = ''
   queryParams.tenantIds = userStore.orgTenantId
-  queryParams.assessDate= getCurrentMonthRange()
+  queryParams.assessDate = getCurrentMonthRange()
   queryFormRef.value.resetFields()
   handleQuery()
 }
@@ -259,39 +274,34 @@ const resetQuery = () => {
 /** 添加/修改操作 */
 const formRef = ref()
 const openForm = (id?: number) => {
-  if(queryParams.tenantIds.length == 0 || queryParams.tenantIds.length > 1){
+  if (queryParams.tenantIds.length == 0 || queryParams.tenantIds.length > 1) {
     message.error('新增只能选择一个机构')
     return
   }
-  formRef.value.open(queryParams.tenantIds[0], id,false)
+  formRef.value.open(queryParams.tenantIds[0], id, false)
 }
 
 const editRef = ref()
 const openFormEdit = (row: any = {}, id?: number) => {
-  formRef.value.open(row.tenantId, id,false)
+  formRef.value.open(row.tenantId, id, false)
 }
 
-
-const openFormDetail = (row: any = {},id?: number) => {
-  formRef.value.open(row.tenantId,id,true)
+const openFormDetail = (row: any = {}, id?: number) => {
+  formRef.value.open(row.tenantId, id, true)
 }
 
-
-
-
-
 const openClose = async (item) => {
   try {
-    console.log("任务ID",item)
+    console.log('任务ID', item)
     const res = await message.confirm('确定要删除吗?', '提示')
     if (res == 'confirm') {
       // 发起
       try {
         const res = await perceptionDelete(item.id)
-        if (res){
+        if (res) {
           message.success(t('common.updateSuccess'))
         }
-      }catch(err) {}
+      } catch (err) {}
     }
     // 刷新列表
     await getList()
@@ -314,7 +324,7 @@ const cancelDelete = async (id: number) => {
 const route = useRoute()
 /** 初始化 **/
 onMounted(() => {
-  if(route.query && route.query.elderName){
+  if (route.query && route.query.elderName) {
     queryParams.elderName = route.query.elderName as string
   }
   getList()

+ 8 - 0
src/views/social-worker/assessment/SAS/index.vue

@@ -101,6 +101,14 @@
         min-width="150"
         show-overflow-tooltip
       />
+      <el-table-column
+        prop="bedName"
+        header-align="center"
+        align="center"
+        label="床位号"
+        min-width="150"
+        show-overflow-tooltip
+      />
       <el-table-column
         prop="assessor"
         header-align="center"

+ 8 - 2
src/views/social-worker/assessment/SDS/index.vue

@@ -99,6 +99,14 @@
         min-width="150"
         show-overflow-tooltip
       />
+      <el-table-column
+        prop="bedName"
+        header-align="center"
+        align="center"
+        label="床位号"
+        min-width="150"
+        show-overflow-tooltip
+      />
       <el-table-column
         prop="assessor"
         header-align="center"
@@ -355,8 +363,6 @@ onMounted(async () => {
   try {
     buildList.value = await getBuildList({ tenantIds: queryParams.tenantIds[0] })
   } catch (e) {}
-
-
 })
 
 // 表头格式

+ 8 - 0
src/views/social-worker/assessment/psychological-social-situation/index.vue

@@ -94,6 +94,14 @@
         min-width="150"
         show-overflow-tooltip
       />
+      <el-table-column
+        prop="bedName"
+        header-align="center"
+        align="center"
+        label="床位号"
+        min-width="150"
+        show-overflow-tooltip
+      />
       <el-table-column
         prop="assessor"
         header-align="center"