| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492 |
- <template>
- <ContentWrap>
- <!-- 搜索工作栏 -->
- <el-form
- class="-mb-15px"
- :model="queryParams"
- ref="queryFormRef"
- :inline="true"
- label-width="80px"
- >
- <el-form-item label="长者姓名" prop="elderName">
- <el-input
- v-model="queryParams.elderName"
- placeholder="请输入长者姓名"
- class="!w-240px"
- @keyup.enter="handleQuery"
- />
- </el-form-item>
- <!-- <el-form-item label="评估年份">-->
- <!-- <el-date-picker-->
- <!-- size="default"-->
- <!-- ref="selectRef"-->
- <!-- class="!w-240px"-->
- <!-- v-model="queryParams.recordMonthRange"-->
- <!-- type="year"-->
- <!-- :clearable="true"-->
- <!-- :editable="false"-->
- <!-- placeholder="选择记录年份"-->
- <!-- value-format="YYYY"-->
- <!-- format="YYYY"-->
- <!-- date-format="YYYY"-->
- <!-- />-->
- <!-- </el-form-item>-->
- <el-form-item>
- <el-button @click="handleQuery"> <Icon icon="ep:search" class="mr-5px" /> 搜索 </el-button>
- <el-button @click="resetQuery"> <Icon icon="ep:refresh" class="mr-5px" /> 重置 </el-button>
- </el-form-item>
- </el-form>
- </ContentWrap>
- <!-- 列表 -->
- <ContentWrap>
- <TabBarBtn>
- <template #next>
- <el-button type="primary" @click="handleAdd">
- <Icon icon="ep:plus" class="mr-5px" /> 新增
- </el-button>
- <el-button type="success" @click="handleExport">
- <Icon icon="ep:upload" class="mr-5px" /> 导出
- </el-button>
- </template>
- </TabBarBtn>
- <el-table v-loading="loading" :data="list" stripe>
- <el-table-column type="index" label="序号" width="60" align="center" />
- <el-table-column
- label="机构名称"
- v-if="userStore.getUser.id == 1"
- type="index"
- width="150"
- align="center"
- >
- <template #default="{ row }">
- {{ findLabelById(userStore.getOrgTenant.options, row.tenantId) }}
- </template>
- </el-table-column>
- <el-table-column label="长者姓名" prop="elderName" width="110" align="center" />
- <el-table-column label="性别" prop="elderSex" width="80" align="center">
- <template #default="{ row }">
- {{ getDictLabel(DICT_TYPE.SYSTEM_USER_SEX, row.elderSex) }}
- </template>
- </el-table-column>
- <el-table-column label="年龄" prop="elderAge" width="80" align="center" />
- <el-table-column label="床号" prop="bedName" width="200" align="center" />
- <el-table-column label="合同号" prop="contractNumber" width="150" align="center" />
- <el-table-column label="护理级别" prop="nurseLevelName" width="150" align="center" />
- <el-table-column label="防噎食评估" prop="asphyxiationRisk" width="130" align="center">
- <template #default="{ row }">
- <el-tag
- :type="getRiskType(row.riskData?.asphyxiation?.level)"
- :class="{ 'cursor-pointer': row.riskData?.asphyxiation?.id }"
- @click="
- row.riskData?.asphyxiation?.id && handleOpenAsphyxiation(row.riskData?.asphyxiation)
- "
- >{{ getRiskLevelText(row.riskData?.asphyxiation?.level || '-') }}</el-tag
- >
- </template>
- </el-table-column>
- <el-table-column label="防压疮评估" prop="pressureUlcerRisk" width="130" align="center">
- <template #default="{ row }">
- <el-tag
- :type="getRiskType(row.riskData?.pressureUlcer?.level)"
- :class="{ 'cursor-pointer': row.riskData?.pressureUlcer?.id }"
- @click="
- row.riskData?.pressureUlcer?.id &&
- handleOpenPressureUlcer(row.riskData?.pressureUlcer)
- "
- >{{ getRiskLevelText(row.riskData?.pressureUlcer?.level || '-') }}</el-tag
- >
- </template>
- </el-table-column>
- <el-table-column label="防跌倒评估" prop="fallRisk" width="130" align="center">
- <template #default="{ row }">
- <el-tag
- :type="getRiskType(row.riskData?.fall?.level)"
- :class="{ 'cursor-pointer': row.riskData?.fall?.id }"
- @click="row.riskData?.fall?.id && handleOpenFall(row.riskData?.fall)"
- >{{ getRiskLevelText(row.riskData?.fall?.level || '-') }}</el-tag
- >
- </template>
- </el-table-column>
- <el-table-column label="防坠床评估" prop="bedFallRisk" width="130" align="center">
- <template #default="{ row }">
- <el-tag
- :type="getRiskType(row.riskData?.bedFall?.level)"
- :class="{ 'cursor-pointer': row.riskData?.bedFall?.id }"
- @click="row.riskData?.bedFall?.id && handleOpenBedFall(row.riskData?.bedFall)"
- >{{ getRiskLevelText(row.riskData?.bedFall?.level || '-') }}</el-tag
- >
- </template>
- </el-table-column>
- <el-table-column label="防烫伤评估" prop="scaldRisk" width="130" align="center">
- <template #default="{ row }">
- <el-tag
- :type="getRiskType(row.riskData?.scald?.level)"
- :class="{ 'cursor-pointer': row.riskData?.scald?.id }"
- @click="row.riskData?.scald?.id && handleOpenScald(row.riskData?.scald)"
- >{{ getRiskLevelText(row.riskData?.scald?.level || '-') }}</el-tag
- >
- </template>
- </el-table-column>
- <el-table-column label="防走失评估" prop="wanderingRisk" width="130" align="center">
- <template #default="{ row }">
- <el-tag
- :type="getRiskType(row.riskData?.wandering?.level)"
- :class="{ 'cursor-pointer': row.riskData?.wandering?.id }"
- @click="row.riskData?.wandering?.id && handleOpenWandering(row.riskData?.wandering)"
- >{{ getRiskLevelText(row.riskData?.wandering?.level || '-') }}</el-tag
- >
- </template>
- </el-table-column>
- <el-table-column label="防自伤他伤评估" prop="suicideRisk" width="130" align="center">
- <template #default="{ row }">
- <el-tag
- :type="getRiskType(row.riskData?.selfHarm?.level)"
- :class="{ 'cursor-pointer': row.riskData?.selfHarm?.id }"
- @click="row.riskData?.selfHarm?.id && handleOpenSuicide(row.riskData?.selfHarm)"
- >{{ getRiskLevelText(row.riskData?.selfHarm?.level || '-') }}</el-tag
- >
- </template>
- </el-table-column>
- <el-table-column label="防食品药品误食评估" prop="perceptionRisk" width="152" align="center">
- <template #default="{ row }">
- <el-tag
- :type="getRiskType(row.riskData?.foodDrug?.level)"
- :class="{ 'cursor-pointer': row.riskData?.foodDrug?.id }"
- @click="row.riskData?.foodDrug?.id && handleOpenMental(row.riskData?.foodDrug)"
- >{{ getRiskLevelText(row.riskData?.foodDrug?.level || '-') }}</el-tag
- >
- </template>
- </el-table-column>
- <el-table-column label="防文娱活动意外" prop="balanceRisk" width="130" align="center">
- <template #default="{ row }">
- <el-tag
- :type="getRiskType(row.riskData?.entertainment?.level)"
- :class="{ 'cursor-pointer': row.riskData?.entertainment?.id }"
- @click="
- row.riskData?.entertainment?.id && handleOpenBalance(row.riskData?.entertainment)
- "
- >{{ getRiskLevelText(row.riskData?.entertainment?.level || '-') }}</el-tag
- >
- </template>
- </el-table-column>
- <el-table-column label="记录时间" prop="bedName" width="200" align="center">
- <template #default="{ row }">
- {{ formatToDateTime(row.createTime) }}
- </template>
- </el-table-column>
- <el-table-column label="记录人" prop="creator" width="150" align="center" />
- <el-table-column label="操作" align="center" width="200" fixed="right">
- <template #default="scope">
- <el-button link type="primary" @click="handleEdit(scope.row, scope.row.id)">
- 编辑
- </el-button>
- <el-button link type="warning" @click="handleView(scope.row, scope.row.id)">
- 详情
- </el-button>
- <el-button link type="danger" @click="handleDelete(scope.row)"> 删除 </el-button>
- </template>
- </el-table-column>
- </el-table>
- <!-- 分页 -->
- <Pagination
- :total="total"
- v-model:page="queryParams.pageNo"
- v-model:limit="queryParams.pageSize"
- @pagination="getList"
- />
- </ContentWrap>
- <!-- 新增/编辑弹窗 -->
- <SafetyRiskNoticeForm ref="formRef" @success="getList" />
- <!-- 各项评估详情弹窗 -->
- <AsphyxiationForm ref="asphyxiationFormRef" />
- <PressureSoresForm ref="pressureSoresFormRef" />
- <FallDownForm ref="fallDownFormRef" />
- <FallPreventionForm ref="fallPreventionFormRef" />
- <EmpyrosisForm ref="empyrosisFormRef" />
- <WanderAwayForm ref="wanderAwayFormRef" />
- <CommitSuicideForm ref="commitSuicideFormRef" />
- <MMSEForm ref="mmseFormRef" />
- <AttackForm ref="attackFormRef" />
- <AntiEntertainmentForm ref="equilibriumFormRef" />
- <DailyLifeForm ref="dailyLifeFormRef" />
- <NutritionalRiskForm ref="nutritionalRiskFormRef" />
- </template>
- <script setup lang="ts">
- import { DICT_TYPE, findLabelById, getDictLabel } from '@/utils/dict'
- import { getSafetyRiskNoticePage, deleteSafetyRiskNotice } from '@/api/elderly/apply/check-in'
- import { formatTime } from '@/utils'
- import SafetyRiskNoticeForm from './Form.vue'
- import AsphyxiationForm from '@/views/elderly/apply/nine-precautions/asphyxiation-by-choking/AddForm.vue'
- import PressureSoresForm from '@/views/elderly/apply/nine-precautions/pressure-sores/AddForm.vue'
- import FallDownForm from '@/views/elderly/apply/nine-precautions/fall-down/AddForm.vue'
- import FallPreventionForm from '@/views/elderly/apply/nine-precautions/fall-prevention-measures/AddForm.vue'
- import EmpyrosisForm from '@/views/elderly/apply/nine-precautions/empyrosis/AddForm.vue'
- import WanderAwayForm from '@/views/elderly/apply/nine-precautions/wander-away/AddForm.vue'
- import CommitSuicideForm from '@/views/elderly/apply/nine-precautions/commit-suicide/AddForm.vue'
- import MMSEForm from '@/views/elderly/apply/nine-precautions/MMSE/AddForm.vue'
- import AttackForm from '@/views/elderly/apply/nine-precautions/attack/AddForm.vue'
- import AntiEntertainmentForm from '@/views/elderly/apply/nine-precautions/anti-entertainment/AddForm.vue'
- import DailyLifeForm from '@/views/elderly/apply/nine-precautions/daily-life/AddForm.vue'
- import NutritionalRiskForm from '@/views/elderly/apply/nine-precautions/nutritional-risk/AddForm.vue'
- import { useUserStore } from '@/store/modules/user'
- import { formatToDateTime } from '@/utils/dateUtil'
- import { exportWithExpandedObjectArrays } from '@/utils/excel-export'
- const userStore = useUserStore()
- defineOptions({ name: 'RiskDisclosureStatement' })
- const message = useMessage()
- const { t } = useI18n()
- // 列表数据
- const loading = ref(false)
- const list = ref([])
- const total = ref(0)
- // 查询参数
- const queryParams = reactive({
- pageNo: 1,
- pageSize: 10,
- elderName: undefined,
- floorName: undefined,
- tenantIds: userStore.orgTenantId
- })
- const queryFormRef = ref()
- // 解析 riskData JSON 字符串
- const parseRiskData = (row: any) => {
- if (!row.riskData) return {}
- try {
- return typeof row.riskData === 'string' ? JSON.parse(row.riskData) : row.riskData
- } catch (e) {
- return {}
- }
- }
- // 获取列表
- const getList = async () => {
- loading.value = true
- try {
- const data = await getSafetyRiskNoticePage(queryParams)
- list.value = (data.list || []).map((item: any) => ({
- ...item,
- riskData: parseRiskData(item)
- }))
- total.value = data.total || 0
- } finally {
- loading.value = false
- }
- }
- // 搜索
- const handleQuery = () => {
- queryParams.pageNo = 1
- getList()
- }
- // 重置
- const resetQuery = () => {
- queryFormRef.value?.resetFields()
- handleQuery()
- }
- // 新增
- const formRef = ref()
- const handleAdd = () => {
- formRef.value?.open()
- }
- // 各项评估弹窗引用
- const asphyxiationFormRef = ref()
- const pressureSoresFormRef = ref()
- const fallDownFormRef = ref()
- const fallPreventionFormRef = ref()
- const empyrosisFormRef = ref()
- const wanderAwayFormRef = ref()
- const commitSuicideFormRef = ref()
- const mmseFormRef = ref()
- const attackFormRef = ref()
- const communicationFormRef = ref()
- const equilibriumFormRef = ref()
- const dailyLifeFormRef = ref()
- const nutritionalRiskFormRef = ref()
- // 各项评估点击处理方法
- const handleOpenAsphyxiation = (row: any) => {
- asphyxiationFormRef.value?.open(queryParams.tenantIds[0], row.id, true)
- }
- const handleOpenPressureUlcer = (row: any) => {
- pressureSoresFormRef.value?.open(queryParams.tenantIds[0], row.id, true)
- }
- const handleOpenFall = (row: any) => {
- fallDownFormRef.value?.open(queryParams.tenantIds[0], row.id, true)
- }
- const handleOpenBedFall = (row: any) => {
- fallPreventionFormRef.value?.open(queryParams.tenantIds[0], row.id, true)
- }
- const handleOpenScald = (row: any) => {
- empyrosisFormRef.value?.open(queryParams.tenantIds[0], row.id, true)
- }
- const handleOpenWandering = (row: any) => {
- wanderAwayFormRef.value?.open(queryParams.tenantIds[0], row.id, true)
- }
- const handleOpenSuicide = (row: any) => {
- commitSuicideFormRef.value?.open(queryParams.tenantIds[0], row.id, true)
- }
- const handleOpenMental = (row: any) => {
- mmseFormRef.value?.open(queryParams.tenantIds[0], row.id, true)
- }
- const handleOpenAttack = (row: any) => {
- attackFormRef.value?.open(queryParams.tenantIds[0], row.id, true)
- }
- const handleOpenPerception = (row: any) => {
- communicationFormRef.value?.open(queryParams.tenantIds[0], row.id, true)
- }
- const handleOpenBalance = (row: any) => {
- equilibriumFormRef.value?.open(queryParams.tenantIds[0], row.id, true)
- }
- const handleOpenDailyLiving = (row: any) => {
- dailyLifeFormRef.value?.open(queryParams.tenantIds[0], row.id, true)
- }
- const handleOpenNutrition = (row: any) => {
- nutritionalRiskFormRef.value?.open(queryParams.tenantIds[0], row.id, true)
- }
- // 获取风险等级文本
- const getRiskLevelText = (riskLevel: string) => {
- switch (riskLevel) {
- case 'none':
- return '无风险'
- case 'low':
- return '低风险'
- case 'medium':
- return '中度风险'
- case 'high':
- return '高风险'
- default:
- return '-'
- }
- }
- // 导出
- const handleExport = async () => {
- try {
- if (!list.value || (list.value as any[]).length <= 0) {
- message.error('暂无数据可以导出!')
- return
- }
- // 预处理数据:解析 riskData 中各风险字段并映射为中文
- const exportList = (list.value as any[]).map((row, index) => {
- const rd = row.riskData || {}
- return {
- index: index + 1,
- elderName: row.elderName || '',
- elderSex: getDictLabel(DICT_TYPE.SYSTEM_USER_SEX, row.elderSex) || '',
- elderAge: row.elderAge ?? '',
- bedName: row.bedName || '',
- contractNumber: row.contractNumber || '',
- nurseLevelName: row.nurseLevelName || '',
- asphyxiationRisk: getRiskLevelText(rd.asphyxiation?.level || '-'),
- pressureUlcerRisk: getRiskLevelText(rd.pressureUlcer?.level || '-'),
- fallRisk: getRiskLevelText(rd.fall?.level || '-'),
- bedFallRisk: getRiskLevelText(rd.bedFall?.level || '-'),
- scaldRisk: getRiskLevelText(rd.scald?.level || '-'),
- wanderingRisk: getRiskLevelText(rd.wandering?.level || '-'),
- selfHarmRisk: getRiskLevelText(rd.selfHarm?.level || '-'),
- foodDrugRisk: getRiskLevelText(rd.foodDrug?.level || '-'),
- entertainmentRisk: getRiskLevelText(rd.entertainment?.level || '-'),
- createTime: row.createTime ? formatToDateTime(row.createTime) : '',
- creator: row.creator || ''
- }
- })
- const headers = [
- { key: 'index', title: '序号' },
- { key: 'elderName', title: '长者姓名' },
- { key: 'elderSex', title: '性别' },
- { key: 'elderAge', title: '年龄' },
- { key: 'bedName', title: '床号' },
- { key: 'contractNumber', title: '合同号' },
- { key: 'nurseLevelName', title: '护理级别' },
- { key: 'asphyxiationRisk', title: '防噎食评估' },
- { key: 'pressureUlcerRisk', title: '防压疮评估' },
- { key: 'fallRisk', title: '防跌倒评估' },
- { key: 'bedFallRisk', title: '防坠床评估' },
- { key: 'scaldRisk', title: '防烫伤评估' },
- { key: 'wanderingRisk', title: '防走失评估' },
- { key: 'selfHarmRisk', title: '防自伤他伤评估' },
- { key: 'foodDrugRisk', title: '防食品药品误食评估' },
- { key: 'entertainmentRisk', title: '防文娱活动意外' },
- { key: 'createTime', title: '记录时间' },
- { key: 'creator', title: '记录人' }
- ]
- exportWithExpandedObjectArrays(
- exportList,
- headers,
- `安全风险告知书${formatToDateTime()}.xlsx`,
- '安全风险告知书'
- )
- } catch (error) {
- console.error('导出失败:', error)
- message.error('导出失败!')
- }
- }
- /**
- * 根据风险等级获取按钮类型(颜色)
- * @param riskLevel 风险等级:none(无风险)、low(低风险)、medium(中风险)、high(高风险)
- * @returns Element Plus 按钮类型:success(绿)、info(灰)、warning(黄)、danger(红)、primary(蓝)
- */
- const getRiskType = (riskLevel: string): string => {
- if (!riskLevel) return 'info'
- const level = riskLevel.trim().toLowerCase()
- if (level === 'none') return 'success'
- if (level === 'low') return 'info'
- if (level === 'medium') return 'warning'
- if (level === 'high') return 'danger'
- return 'primary'
- }
- // 编辑
- const handleEdit = (row: any) => {
- formRef.value?.open(row)
- }
- // 详情
- const handleView = (row: any) => {
- formRef.value?.open(row, true)
- }
- // 删除
- const handleDelete = async (row: any) => {
- try {
- await message.confirm('确认删除该记录吗?')
- await deleteSafetyRiskNotice(row.id)
- message.success('删除成功')
- getList()
- } catch (e) {
- // 用户取消
- }
- }
- // 初始化
- onMounted(() => {
- getList()
- })
- </script>
- <style scoped lang="scss"></style>
|