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