|
@@ -1,10 +1,12 @@
|
|
|
<template>
|
|
<template>
|
|
|
- <Dialog
|
|
|
|
|
|
|
+ <el-drawer
|
|
|
v-model="dialogVisible"
|
|
v-model="dialogVisible"
|
|
|
:title="dialogTitle"
|
|
:title="dialogTitle"
|
|
|
- width="80%"
|
|
|
|
|
|
|
+ size="70%"
|
|
|
class="risk-disclosure-statement-form"
|
|
class="risk-disclosure-statement-form"
|
|
|
- scroll
|
|
|
|
|
|
|
+ :close-on-click-modal="false"
|
|
|
|
|
+ :close-on-press-escape="false"
|
|
|
|
|
+ :destroy-on-close="true"
|
|
|
@close="handleClosed"
|
|
@close="handleClosed"
|
|
|
>
|
|
>
|
|
|
<el-form
|
|
<el-form
|
|
@@ -38,9 +40,8 @@
|
|
|
</el-row>
|
|
</el-row>
|
|
|
|
|
|
|
|
<!-- 长者详情展示 - 对应图片中的表一表头信息 -->
|
|
<!-- 长者详情展示 - 对应图片中的表一表头信息 -->
|
|
|
- <div v-if="elderDetail.id" class="elder-detail-wrap">
|
|
|
|
|
- <el-descriptions :column="4" border size="small">
|
|
|
|
|
- <el-descriptions-item label="区/楼层">{{ elderDetail.floorName || '-' }}</el-descriptions-item>
|
|
|
|
|
|
|
+ <div class="elder-detail-wrap">
|
|
|
|
|
+ <el-descriptions :column="2" border size="small">
|
|
|
<el-descriptions-item label="姓名">{{ elderDetail.elderName || '-' }}</el-descriptions-item>
|
|
<el-descriptions-item label="姓名">{{ elderDetail.elderName || '-' }}</el-descriptions-item>
|
|
|
<el-descriptions-item label="性别">{{ getDictLabel(DICT_TYPE.SYSTEM_USER_SEX, elderDetail.elderSex) || '-' }}</el-descriptions-item>
|
|
<el-descriptions-item label="性别">{{ getDictLabel(DICT_TYPE.SYSTEM_USER_SEX, elderDetail.elderSex) || '-' }}</el-descriptions-item>
|
|
|
<el-descriptions-item label="年龄">{{ elderDetail.elderAge || '-' }}岁</el-descriptions-item>
|
|
<el-descriptions-item label="年龄">{{ elderDetail.elderAge || '-' }}岁</el-descriptions-item>
|
|
@@ -59,141 +60,92 @@
|
|
|
经我院评估您或您相关第三方的身体状况,您或您亲属在我院养老期间,存在下列服务安全风险。为保证对您或您相关第三方的服务质量,特向您告知!我院将针对老年人的情况做好相关防范措施,请您理解、配合、并支持相关工作措施的落实。
|
|
经我院评估您或您相关第三方的身体状况,您或您亲属在我院养老期间,存在下列服务安全风险。为保证对您或您相关第三方的服务质量,特向您告知!我院将针对老年人的情况做好相关防范措施,请您理解、配合、并支持相关工作措施的落实。
|
|
|
</p>
|
|
</p>
|
|
|
|
|
|
|
|
- <!-- 风险项目列表 -->
|
|
|
|
|
- <div class="risk-list">
|
|
|
|
|
- <div v-for="(item, index) in riskItems" :key="index" class="risk-item">
|
|
|
|
|
- <el-checkbox v-model="item.checked" :label="item.name" />
|
|
|
|
|
- <span class="risk-label">风险程度:</span>
|
|
|
|
|
- <el-radio-group v-model="item.riskLevel" size="small">
|
|
|
|
|
- <el-radio value="low">低危</el-radio>
|
|
|
|
|
- <el-radio value="medium">中危</el-radio>
|
|
|
|
|
- <el-radio value="high">高危</el-radio>
|
|
|
|
|
- </el-radio-group>
|
|
|
|
|
- </div>
|
|
|
|
|
|
|
+ <!-- 风险项目表格 -->
|
|
|
|
|
+ <div class="risk-table-wrapper">
|
|
|
|
|
+ <table class="risk-table">
|
|
|
|
|
+ <thead>
|
|
|
|
|
+ <tr>
|
|
|
|
|
+ <th class="col-index">序号</th>
|
|
|
|
|
+ <th class="col-project">项目</th>
|
|
|
|
|
+ <th class="col-level">风险程度</th>
|
|
|
|
|
+ <th class="col-remark">备注</th>
|
|
|
|
|
+ </tr>
|
|
|
|
|
+ </thead>
|
|
|
|
|
+ <tbody>
|
|
|
|
|
+ <tr v-for="(item, index) in riskTableItems" :key="index">
|
|
|
|
|
+ <td class="col-index">{{ index + 1 }}</td>
|
|
|
|
|
+ <td class="col-project">{{ item.name }}</td>
|
|
|
|
|
+ <td class="col-level">
|
|
|
|
|
+ <el-select
|
|
|
|
|
+ v-model="item.riskLevel"
|
|
|
|
|
+ placeholder="请选择"
|
|
|
|
|
+ style="width: 120px"
|
|
|
|
|
+ :disabled="isView"
|
|
|
|
|
+ >
|
|
|
|
|
+ <el-option
|
|
|
|
|
+ v-for="option in getRiskOptions(item.key)"
|
|
|
|
|
+ :key="option.value"
|
|
|
|
|
+ :label="option.label"
|
|
|
|
|
+ :value="option.value"
|
|
|
|
|
+ />
|
|
|
|
|
+ </el-select>
|
|
|
|
|
+ </td>
|
|
|
|
|
+ <td class="col-remark">
|
|
|
|
|
+ <span class="remark-text">风险程度:</span>
|
|
|
|
|
+ <el-checkbox v-model="item.lowChecked" :disabled="isView" size="small">低危</el-checkbox>
|
|
|
|
|
+ <el-checkbox v-model="item.mediumChecked" :disabled="isView" size="small">中危</el-checkbox>
|
|
|
|
|
+ <el-checkbox v-model="item.highChecked" :disabled="isView" size="small">高危</el-checkbox>
|
|
|
|
|
+ </td>
|
|
|
|
|
+ </tr>
|
|
|
|
|
+ </tbody>
|
|
|
|
|
+ </table>
|
|
|
</div>
|
|
</div>
|
|
|
|
|
|
|
|
- <!-- 其他风险 -->
|
|
|
|
|
- <el-form-item label="其它服务风险:" class="other-risk">
|
|
|
|
|
- <TgTextarea v-model="dataForm.otherRisk" placeholder="请输入其他服务风险" :rows="2" />
|
|
|
|
|
- </el-form-item>
|
|
|
|
|
- </div>
|
|
|
|
|
|
|
+ <!-- 预计下次评估日期 -->
|
|
|
|
|
+ <div class="next-assess-date">
|
|
|
|
|
+ <span class="date-label">预计下次评估日期:</span>
|
|
|
|
|
+ <el-date-picker
|
|
|
|
|
+ v-model="dataForm.nextAssessDate"
|
|
|
|
|
+ type="date"
|
|
|
|
|
+ placeholder="选择日期"
|
|
|
|
|
+ style="width: 150px"
|
|
|
|
|
+ :disabled="isView"
|
|
|
|
|
+ />
|
|
|
|
|
+ <span class="date-value">{{ dataForm.nextAssessDate ? formatDate(dataForm.nextAssessDate) : '无' }}</span>
|
|
|
|
|
+ </div>
|
|
|
|
|
|
|
|
- <!-- 签名区域 -->
|
|
|
|
|
- <div class="section-title">签字确认</div>
|
|
|
|
|
- <el-row :gutter="20">
|
|
|
|
|
- <el-col :span="24">
|
|
|
|
|
- <el-form-item label="首次告知签名:" label-width="170">
|
|
|
|
|
- <div style="display: flex;flex-direction: row">
|
|
|
|
|
- <div style="display: flex;align-items: center;width: 560px">
|
|
|
|
|
- 通过对老年人的整体评估,老年人有可能发生:
|
|
|
|
|
- <TgInput v-model="dataForm.firstRisk" placeholder="输入风险" style="width: 250px;margin-left: 10px"/>
|
|
|
|
|
- </div>
|
|
|
|
|
- 其风险及防范措施已向老年人或相关第三方进行了如实告知。
|
|
|
|
|
- </div>
|
|
|
|
|
- </el-form-item>
|
|
|
|
|
- </el-col>
|
|
|
|
|
- <el-col :span="24">
|
|
|
|
|
- <el-form-item label="护理人员签名" label-width="170">
|
|
|
|
|
- <TgInput v-model="dataForm.firstNurseSign" placeholder="签字人" />
|
|
|
|
|
- </el-form-item>
|
|
|
|
|
- </el-col>
|
|
|
|
|
- </el-row>
|
|
|
|
|
- <el-row :gutter="20">
|
|
|
|
|
- <el-col :span="12">
|
|
|
|
|
- <el-form-item label="老年人/相关第三方签字" label-width="170">
|
|
|
|
|
- <TgInput v-model="dataForm.firstElderSign" placeholder="签字人" />
|
|
|
|
|
- </el-form-item>
|
|
|
|
|
- </el-col>
|
|
|
|
|
- <el-col :span="12">
|
|
|
|
|
- <el-form-item label="签字日期">
|
|
|
|
|
- <TgDatePicker v-model="dataForm.firstSignDate" type="date" placeholder="选择日期" />
|
|
|
|
|
- </el-form-item>
|
|
|
|
|
- </el-col>
|
|
|
|
|
- </el-row>
|
|
|
|
|
|
|
+ <!-- 告知签名区域 -->
|
|
|
|
|
+ <div class="signature-section">
|
|
|
|
|
+ <div class="signature-title">告知签名:</div>
|
|
|
|
|
+ <p class="signature-desc">
|
|
|
|
|
+ 通过对老年人的整体评估,老年人有可能发生以上风险,其风险及防范措施已向老年人或相关第三方进行了如实告知。
|
|
|
|
|
+ </p>
|
|
|
|
|
+ <p class="signature-declare">
|
|
|
|
|
+ (老年人或相关第三方声明:本人已知悉并签字确认。)
|
|
|
|
|
+ </p>
|
|
|
|
|
+
|
|
|
|
|
+ <div class="signature-item">
|
|
|
|
|
+ <span class="signature-label">经办人(护理人员):</span>
|
|
|
|
|
|
|
|
- <!-- 第二次告知签名 -->
|
|
|
|
|
- <el-divider />
|
|
|
|
|
- <el-row :gutter="20">
|
|
|
|
|
- <el-col :span="24">
|
|
|
|
|
- <el-form-item label="第二次告知签名:" label-width="170">
|
|
|
|
|
- <div style="display: flex;flex-direction: row">
|
|
|
|
|
- <div style="display: flex;align-items: center;width: 700px">
|
|
|
|
|
- 通过对老年人的整体评估,随着病情的发展变化,老年人有可能发生:
|
|
|
|
|
- <TgInput v-model="dataForm.secondRisk" placeholder="输入风险" style="width: 250px;margin-left: 10px"/>
|
|
|
|
|
- </div>
|
|
|
|
|
- 其风险及防范措施已向老年人或相关第三方进行了如实告知。
|
|
|
|
|
- </div>
|
|
|
|
|
- </el-form-item>
|
|
|
|
|
- </el-col>
|
|
|
|
|
- <el-col :span="24">
|
|
|
|
|
- <el-form-item label="护理人员" label-width="170">
|
|
|
|
|
- <TgInput v-model="dataForm.secondNurseSign" placeholder="签字人" />
|
|
|
|
|
- </el-form-item>
|
|
|
|
|
- </el-col>
|
|
|
|
|
- </el-row>
|
|
|
|
|
- <el-row :gutter="20">
|
|
|
|
|
- <el-col :span="12">
|
|
|
|
|
- <el-form-item label="变动风险" label-width="170">
|
|
|
|
|
- <TgInput v-model="dataForm.secondChangeRisk" placeholder="变动风险描述" />
|
|
|
|
|
- </el-form-item>
|
|
|
|
|
- </el-col>
|
|
|
|
|
- <el-col :span="12">
|
|
|
|
|
- <el-form-item label="风险程度">
|
|
|
|
|
- <el-radio-group v-model="dataForm.secondRiskLevel" size="small">
|
|
|
|
|
- <el-radio value="low">低危</el-radio>
|
|
|
|
|
- <el-radio value="medium">中危</el-radio>
|
|
|
|
|
- <el-radio value="high">高危</el-radio>
|
|
|
|
|
- </el-radio-group>
|
|
|
|
|
- </el-form-item>
|
|
|
|
|
- </el-col>
|
|
|
|
|
- </el-row>
|
|
|
|
|
- <el-row :gutter="20">
|
|
|
|
|
- <el-col :span="12">
|
|
|
|
|
- <el-form-item label="老年人/相关第三方签字" label-width="170">
|
|
|
|
|
- <TgInput v-model="dataForm.secondElderSign" placeholder="签字人" />
|
|
|
|
|
- </el-form-item>
|
|
|
|
|
- </el-col>
|
|
|
|
|
- <el-col :span="12">
|
|
|
|
|
- <el-form-item label="签字日期">
|
|
|
|
|
- <TgDatePicker v-model="dataForm.secondSignDate" type="date" placeholder="选择日期" />
|
|
|
|
|
- </el-form-item>
|
|
|
|
|
- </el-col>
|
|
|
|
|
- </el-row>
|
|
|
|
|
|
|
+ </div>
|
|
|
|
|
+
|
|
|
|
|
+ <div class="signature-item">
|
|
|
|
|
+ <span class="signature-label">老年人或相关第三方签名:</span>
|
|
|
|
|
|
|
|
- <!-- 其他备注 -->
|
|
|
|
|
- <el-divider />
|
|
|
|
|
- <el-form-item label="其他">
|
|
|
|
|
- <TgTextarea v-model="dataForm.remark" placeholder="请输入其他备注信息" :rows="3" />
|
|
|
|
|
- </el-form-item>
|
|
|
|
|
|
|
+ </div>
|
|
|
|
|
+ </div>
|
|
|
|
|
+ </div>
|
|
|
|
|
|
|
|
- <!-- 底部签名 -->
|
|
|
|
|
- <el-row :gutter="20">
|
|
|
|
|
- <el-col :span="12">
|
|
|
|
|
- <el-form-item label="护理人员">
|
|
|
|
|
- <TgInput v-model="dataForm.nurseSign" placeholder="护理人员签字" />
|
|
|
|
|
- </el-form-item>
|
|
|
|
|
- </el-col>
|
|
|
|
|
- <el-col :span="12">
|
|
|
|
|
- <el-form-item label="老年人/相关第三方签字" label-width="170">
|
|
|
|
|
- <TgInput v-model="dataForm.elderSign" placeholder="签字人" />
|
|
|
|
|
- </el-form-item>
|
|
|
|
|
- </el-col>
|
|
|
|
|
- </el-row>
|
|
|
|
|
- <el-row :gutter="20">
|
|
|
|
|
- <el-col :span="12" :offset="12">
|
|
|
|
|
- <el-form-item label="签字日期" label-width="170">
|
|
|
|
|
- <TgDatePicker v-model="dataForm.signDate" type="date" placeholder="选择日期" />
|
|
|
|
|
- </el-form-item>
|
|
|
|
|
- </el-col>
|
|
|
|
|
- </el-row>
|
|
|
|
|
|
|
+
|
|
|
</el-form>
|
|
</el-form>
|
|
|
|
|
|
|
|
<template #footer>
|
|
<template #footer>
|
|
|
<el-button v-if="!isView" @click="handleClosed">取消</el-button>
|
|
<el-button v-if="!isView" @click="handleClosed">取消</el-button>
|
|
|
<el-button v-if="!isView" type="primary" @click="submitForm" :loading="submitLoading">确定</el-button>
|
|
<el-button v-if="!isView" type="primary" @click="submitForm" :loading="submitLoading">确定</el-button>
|
|
|
<el-button v-if="isView" @click="handleClosed">关闭</el-button>
|
|
<el-button v-if="isView" @click="handleClosed">关闭</el-button>
|
|
|
|
|
+ <el-button v-if="isView" type="success" @click="handleExport">打印</el-button>
|
|
|
</template>
|
|
</template>
|
|
|
- </Dialog>
|
|
|
|
|
|
|
+ </el-drawer>
|
|
|
</template>
|
|
</template>
|
|
|
|
|
|
|
|
<script setup lang="ts">
|
|
<script setup lang="ts">
|
|
@@ -223,18 +175,71 @@ const selectElderRef = ref()
|
|
|
// 长者详情
|
|
// 长者详情
|
|
|
const elderDetail = ref<any>({})
|
|
const elderDetail = ref<any>({})
|
|
|
|
|
|
|
|
-// 风险项目
|
|
|
|
|
-const riskItems = ref([
|
|
|
|
|
- { name: '噎食', checked: false, riskLevel: '' },
|
|
|
|
|
- { name: '食品药品误食', checked: false, riskLevel: '' },
|
|
|
|
|
- { name: '压疮', checked: false, riskLevel: '' },
|
|
|
|
|
- { name: '烫伤', checked: false, riskLevel: '' },
|
|
|
|
|
- { name: '坠床', checked: false, riskLevel: '' },
|
|
|
|
|
- { name: '跌倒', checked: false, riskLevel: '' },
|
|
|
|
|
- { name: '他伤或自伤', checked: false, riskLevel: '' },
|
|
|
|
|
- { name: '走失', checked: false, riskLevel: '' }
|
|
|
|
|
|
|
+// 风险项目表格数据
|
|
|
|
|
+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 }
|
|
|
])
|
|
])
|
|
|
|
|
|
|
|
|
|
+// 接口返回的风险数据选项(模拟数据,实际从接口获取)
|
|
|
|
|
+const riskOptionsMap = ref<Record<string, any[]>>({
|
|
|
|
|
+ asphyxiation: [],
|
|
|
|
|
+ pressureUlcer: [],
|
|
|
|
|
+ fall: [],
|
|
|
|
|
+ bedFall: [],
|
|
|
|
|
+ scald: [],
|
|
|
|
|
+ wandering: [],
|
|
|
|
|
+ selfHarm: [],
|
|
|
|
|
+ foodDrug: [],
|
|
|
|
|
+ entertainment: []
|
|
|
|
|
+})
|
|
|
|
|
+
|
|
|
|
|
+// 获取风险选项(从接口数据)
|
|
|
|
|
+const getRiskOptions = (key: string) => {
|
|
|
|
|
+ // 如果接口返回了数据,使用接口数据
|
|
|
|
|
+ const options = riskOptionsMap.value[key]
|
|
|
|
|
+ if (options && options.length > 0) {
|
|
|
|
|
+ return options
|
|
|
|
|
+ }
|
|
|
|
|
+ // 默认选项
|
|
|
|
|
+ return [
|
|
|
|
|
+ { label: '无风险', value: 'none' },
|
|
|
|
|
+ { label: '低风险', value: 'low' },
|
|
|
|
|
+ { label: '中风险', value: 'medium' },
|
|
|
|
|
+ { label: '高风险', value: 'high' }
|
|
|
|
|
+ ]
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+// 加载长者风险数据(从接口获取)
|
|
|
|
|
+const loadElderRiskData = async (elderId: string) => {
|
|
|
|
|
+ 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' }]
|
|
|
|
|
+ }
|
|
|
|
|
+ riskOptionsMap.value = mockData
|
|
|
|
|
+ } catch (e) {
|
|
|
|
|
+ console.error('获取风险数据失败', e)
|
|
|
|
|
+ }
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
// 表单数据
|
|
// 表单数据
|
|
|
const dataForm = reactive({
|
|
const dataForm = reactive({
|
|
|
id: undefined,
|
|
id: undefined,
|
|
@@ -244,6 +249,8 @@ const dataForm = reactive({
|
|
|
// 风险项目数据 (JSON格式存储到 riskData)
|
|
// 风险项目数据 (JSON格式存储到 riskData)
|
|
|
riskData: '',
|
|
riskData: '',
|
|
|
otherRisk: '',
|
|
otherRisk: '',
|
|
|
|
|
+ // 预计下次评估日期
|
|
|
|
|
+ nextAssessDate: '',
|
|
|
// 首次告知签名
|
|
// 首次告知签名
|
|
|
firstRisk: '',
|
|
firstRisk: '',
|
|
|
firstNurseSign: '',
|
|
firstNurseSign: '',
|
|
@@ -277,6 +284,8 @@ const handleSelectElder = async (item: any) => {
|
|
|
try {
|
|
try {
|
|
|
const res = await getElderInfoById(item.id)
|
|
const res = await getElderInfoById(item.id)
|
|
|
elderDetail.value = res
|
|
elderDetail.value = res
|
|
|
|
|
+ // 加载长者的风险评估数据
|
|
|
|
|
+ await loadElderRiskData(item.id)
|
|
|
} catch (e) {
|
|
} catch (e) {
|
|
|
console.error('获取长者详情失败', e)
|
|
console.error('获取长者详情失败', e)
|
|
|
}
|
|
}
|
|
@@ -302,13 +311,20 @@ const open = async (row?: any, viewMode = false) => {
|
|
|
// 解析风险项目
|
|
// 解析风险项目
|
|
|
if (res.riskData) {
|
|
if (res.riskData) {
|
|
|
const parsedData = JSON.parse(res.riskData)
|
|
const parsedData = JSON.parse(res.riskData)
|
|
|
- // 解析风险项目列表
|
|
|
|
|
- if (parsedData.risks && Array.isArray(parsedData.risks)) {
|
|
|
|
|
- riskItems.value = riskItems.value.map(item => {
|
|
|
|
|
- const saved = parsedData.risks.find((s: any) => s.name === item.name)
|
|
|
|
|
- return saved || item
|
|
|
|
|
- })
|
|
|
|
|
- }
|
|
|
|
|
|
|
+ // 解析风险表格数据
|
|
|
|
|
+ riskTableItems.value = riskTableItems.value.map(item => {
|
|
|
|
|
+ const saved = parsedData[item.key]
|
|
|
|
|
+ if (saved) {
|
|
|
|
|
+ return {
|
|
|
|
|
+ ...item,
|
|
|
|
|
+ riskLevel: saved.level || saved.id || '',
|
|
|
|
|
+ lowChecked: saved.remark?.low || false,
|
|
|
|
|
+ mediumChecked: saved.remark?.medium || false,
|
|
|
|
|
+ highChecked: saved.remark?.high || false
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ return item
|
|
|
|
|
+ })
|
|
|
// 解析其他风险
|
|
// 解析其他风险
|
|
|
if (parsedData.otherRisk !== undefined) {
|
|
if (parsedData.otherRisk !== undefined) {
|
|
|
dataForm.otherRisk = parsedData.otherRisk
|
|
dataForm.otherRisk = parsedData.otherRisk
|
|
@@ -329,6 +345,13 @@ const open = async (row?: any, viewMode = false) => {
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+// 日期格式化
|
|
|
|
|
+const formatDate = (date: any) => {
|
|
|
|
|
+ if (!date) return ''
|
|
|
|
|
+ const d = new Date(date)
|
|
|
|
|
+ return `${d.getFullYear()}年${d.getMonth() + 1}月${d.getDate()}日`
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
// 重置表单
|
|
// 重置表单
|
|
|
const resetForm = () => {
|
|
const resetForm = () => {
|
|
|
Object.assign(dataForm, {
|
|
Object.assign(dataForm, {
|
|
@@ -338,6 +361,7 @@ const resetForm = () => {
|
|
|
tenantId: getTenantId(),
|
|
tenantId: getTenantId(),
|
|
|
riskData: '',
|
|
riskData: '',
|
|
|
otherRisk: '',
|
|
otherRisk: '',
|
|
|
|
|
+ nextAssessDate: '',
|
|
|
firstRisk: '',
|
|
firstRisk: '',
|
|
|
firstNurseSign: '',
|
|
firstNurseSign: '',
|
|
|
firstElderSign: '',
|
|
firstElderSign: '',
|
|
@@ -354,16 +378,28 @@ const resetForm = () => {
|
|
|
signDate: ''
|
|
signDate: ''
|
|
|
})
|
|
})
|
|
|
elderDetail.value = {}
|
|
elderDetail.value = {}
|
|
|
- riskItems.value = [
|
|
|
|
|
- { name: '噎食', checked: false, riskLevel: '' },
|
|
|
|
|
- { name: '食品药品误食', checked: false, riskLevel: '' },
|
|
|
|
|
- { name: '压疮', checked: false, riskLevel: '' },
|
|
|
|
|
- { name: '烫伤', checked: false, riskLevel: '' },
|
|
|
|
|
- { name: '坠床', checked: false, riskLevel: '' },
|
|
|
|
|
- { name: '跌倒', checked: false, riskLevel: '' },
|
|
|
|
|
- { name: '他伤或自伤', checked: false, riskLevel: '' },
|
|
|
|
|
- { name: '走失', checked: false, riskLevel: '' }
|
|
|
|
|
|
|
+ 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 }
|
|
|
]
|
|
]
|
|
|
|
|
+ riskOptionsMap.value = {
|
|
|
|
|
+ asphyxiation: [],
|
|
|
|
|
+ pressureUlcer: [],
|
|
|
|
|
+ fall: [],
|
|
|
|
|
+ bedFall: [],
|
|
|
|
|
+ scald: [],
|
|
|
|
|
+ wandering: [],
|
|
|
|
|
+ selfHarm: [],
|
|
|
|
|
+ foodDrug: [],
|
|
|
|
|
+ entertainment: []
|
|
|
|
|
+ }
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
// 关闭弹窗
|
|
// 关闭弹窗
|
|
@@ -380,12 +416,21 @@ const submitForm = async () => {
|
|
|
|
|
|
|
|
submitLoading.value = true
|
|
submitLoading.value = true
|
|
|
try {
|
|
try {
|
|
|
- // 处理风险项目数据 - 包含风险项目列表和其他风险
|
|
|
|
|
- const selectedRisks = riskItems.value.filter(item => item.checked)
|
|
|
|
|
- const riskDataObj = {
|
|
|
|
|
- risks: selectedRisks,
|
|
|
|
|
- otherRisk: dataForm.otherRisk
|
|
|
|
|
- }
|
|
|
|
|
|
|
+ // 处理风险项目数据 - 将表格数据转换为存储格式
|
|
|
|
|
+ const riskDataObj: Record<string, any> = {}
|
|
|
|
|
+ riskTableItems.value.forEach(item => {
|
|
|
|
|
+ riskDataObj[item.key] = {
|
|
|
|
|
+ id: item.riskLevel, // 风险程度ID
|
|
|
|
|
+ level: item.riskLevel, // 风险等级
|
|
|
|
|
+ // 备注信息
|
|
|
|
|
+ remark: {
|
|
|
|
|
+ low: item.lowChecked,
|
|
|
|
|
+ medium: item.mediumChecked,
|
|
|
|
|
+ high: item.highChecked
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ })
|
|
|
|
|
+
|
|
|
const submitData = {
|
|
const submitData = {
|
|
|
...dataForm,
|
|
...dataForm,
|
|
|
riskData: JSON.stringify(riskDataObj)
|
|
riskData: JSON.stringify(riskDataObj)
|
|
@@ -406,6 +451,160 @@ const submitForm = async () => {
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+// 打印功能
|
|
|
|
|
+const handleExport = () => {
|
|
|
|
|
+ // 创建打印窗口
|
|
|
|
|
+ const printWindow = window.open('', '_blank')
|
|
|
|
|
+ if (!printWindow) {
|
|
|
|
|
+ message.error('请允许弹出窗口以进行打印')
|
|
|
|
|
+ return
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ // 获取长者信息
|
|
|
|
|
+ const elderName = elderDetail.value.elderName || ''
|
|
|
|
|
+ const elderSex = getDictLabel(DICT_TYPE.SYSTEM_USER_SEX, elderDetail.value.elderSex) || ''
|
|
|
|
|
+ const elderAge = elderDetail.value.elderAge || ''
|
|
|
|
|
+ const bedName = elderDetail.value.bedName || ''
|
|
|
|
|
+ const nurseLevelName = elderDetail.value.nurseLevelName || ''
|
|
|
|
|
+
|
|
|
|
|
+ // 构建风险表格HTML
|
|
|
|
|
+ let riskTableHtml = ''
|
|
|
|
|
+ riskTableItems.value.forEach((item, index) => {
|
|
|
|
|
+ const riskLevelText = getRiskLevelText(item.riskLevel)
|
|
|
|
|
+ const lowChecked = item.lowChecked ? '☑' : '☐'
|
|
|
|
|
+ const mediumChecked = item.mediumChecked ? '☑' : '☐'
|
|
|
|
|
+ const highChecked = item.highChecked ? '☑' : '☐'
|
|
|
|
|
+
|
|
|
|
|
+ riskTableHtml += `
|
|
|
|
|
+ <tr>
|
|
|
|
|
+ <td style="border: 1px solid #333; padding: 8px; text-align: center;">${index + 1}</td>
|
|
|
|
|
+ <td style="border: 1px solid #333; padding: 8px;">${item.name}</td>
|
|
|
|
|
+ <td style="border: 1px solid #333; padding: 8px; text-align: center;">${riskLevelText}</td>
|
|
|
|
|
+ <td style="border: 1px solid #333; padding: 8px;">
|
|
|
|
|
+ <span>风险程度:</span>
|
|
|
|
|
+ <span>${lowChecked}低危</span>
|
|
|
|
|
+ <span style="margin-left: 10px;">${mediumChecked}中危</span>
|
|
|
|
|
+ <span style="margin-left: 10px;">${highChecked}高危</span>
|
|
|
|
|
+ </td>
|
|
|
|
|
+ </tr>
|
|
|
|
|
+ `
|
|
|
|
|
+ })
|
|
|
|
|
+
|
|
|
|
|
+ // 预计下次评估日期
|
|
|
|
|
+ const nextAssessDate = dataForm.nextAssessDate ? formatDate(dataForm.nextAssessDate) : '无'
|
|
|
|
|
+
|
|
|
|
|
+ // 构建打印内容
|
|
|
|
|
+ const printContent = `
|
|
|
|
|
+ <!DOCTYPE html>
|
|
|
|
|
+ <html>
|
|
|
|
|
+ <head>
|
|
|
|
|
+ <meta charset="UTF-8">
|
|
|
|
|
+ <title>服务安全风险知情告知书</title>
|
|
|
|
|
+ <style>
|
|
|
|
|
+ body { font-family: 'SimSun', serif; font-size: 14px; line-height: 1.6; }
|
|
|
|
|
+ .print-container { width: 210mm; margin: 0 auto; padding: 20mm; }
|
|
|
|
|
+ .title { text-align: center; font-size: 22px; font-weight: bold; margin-bottom: 20px; }
|
|
|
|
|
+ .subtitle { text-align: center; font-size: 16px; margin-bottom: 30px; }
|
|
|
|
|
+ .info-row { display: flex; margin-bottom: 10px; }
|
|
|
|
|
+ .info-item { flex: 3; }
|
|
|
|
|
+ .section-title { font-weight: bold; margin: 20px 0 10px; }
|
|
|
|
|
+ .content-text { text-indent: 2em; margin-bottom: 10px; }
|
|
|
|
|
+ table { width: 100%; border-collapse: collapse; margin: 15px 0; }
|
|
|
|
|
+ th { background-color: #f5f5f5; font-weight: bold; }
|
|
|
|
|
+ .signature-section { margin-top: 30px; }
|
|
|
|
|
+ .signature-title { font-weight: bold; margin-bottom: 10px; }
|
|
|
|
|
+ .signature-item { margin: 15px 0; }
|
|
|
|
|
+ .signature-line { display: inline-block; width: 200px; border-bottom: 1px solid #333; margin-left: 10px; }
|
|
|
|
|
+ .next-date { margin: 15px 0; padding: 10px; background-color: #f5f5f5; }
|
|
|
|
|
+ @media print { body { margin: 0; } .print-container { padding: 10mm; } }
|
|
|
|
|
+ </style>
|
|
|
|
|
+ </head>
|
|
|
|
|
+ <body>
|
|
|
|
|
+ <div class="print-container">
|
|
|
|
|
+ <div class="title">服务安全风险知情告知书</div>
|
|
|
|
|
+
|
|
|
|
|
+ <div class="info-row">
|
|
|
|
|
+ <div class="info-item">姓名:${elderName}</div>
|
|
|
|
|
+ <div class="info-item" style="flex: 2">性别:${elderSex}</div>
|
|
|
|
|
+ <div class="info-item" style="flex: 2">年龄:${elderAge}岁</div>
|
|
|
|
|
+ <div class="info-item">床号:${bedName}</div>
|
|
|
|
|
+ <div class="info-item">护理级别:${nurseLevelName}</div>
|
|
|
|
|
+ </div>
|
|
|
|
|
+
|
|
|
|
|
+ <div class="section-title">尊敬的老年人/相关第三方/监护人:</div>
|
|
|
|
|
+ <div class="content-text">您好!感谢您对本机构的信任和支持。</div>
|
|
|
|
|
+ <div class="content-text">
|
|
|
|
|
+ 经我院评估您或您相关第三方的身体状况,您或您亲属在我院养老期间,存在下列服务安全风险。
|
|
|
|
|
+ 为保证对您或您相关第三方的服务质量,特向您告知!我院将针对老年人的情况做好相关防范措施,
|
|
|
|
|
+ 请您理解、配合、并支持相关工作措施的落实。
|
|
|
|
|
+ </div>
|
|
|
|
|
+
|
|
|
|
|
+ <table>
|
|
|
|
|
+ <thead>
|
|
|
|
|
+ <tr>
|
|
|
|
|
+ <th style="border: 1px solid #333; padding: 8px; width: 60px;">序号</th>
|
|
|
|
|
+ <th style="border: 1px solid #333; padding: 8px;">项目</th>
|
|
|
|
|
+ <th style="border: 1px solid #333; padding: 8px; width: 100px;">风险程度</th>
|
|
|
|
|
+ <th style="border: 1px solid #333; padding: 8px;">备注</th>
|
|
|
|
|
+ </tr>
|
|
|
|
|
+ </thead>
|
|
|
|
|
+ <tbody>
|
|
|
|
|
+ ${riskTableHtml}
|
|
|
|
|
+ </tbody>
|
|
|
|
|
+ </table>
|
|
|
|
|
+
|
|
|
|
|
+ <div class="next-date">
|
|
|
|
|
+ <strong>预计下次评估日期:</strong>${nextAssessDate}
|
|
|
|
|
+ </div>
|
|
|
|
|
+
|
|
|
|
|
+ <div class="signature-section">
|
|
|
|
|
+ <div class="signature-title">告知签名:</div>
|
|
|
|
|
+ <div class="content-text">
|
|
|
|
|
+ 通过对老年人的整体评估,老年人有可能发生以上风险,其风险及防范措施已向老年人或相关第三方进行了如实告知。
|
|
|
|
|
+ </div>
|
|
|
|
|
+ <div style="color: #666; font-size: 12px; margin-bottom: 20px;">
|
|
|
|
|
+ (老年人或相关第三方声明:本人已知悉并签字确认。)
|
|
|
|
|
+ </div>
|
|
|
|
|
+
|
|
|
|
|
+ <div class="signature-item">
|
|
|
|
|
+ <span>经办人(护理人员):</span>
|
|
|
|
|
+
|
|
|
|
|
+ </div>
|
|
|
|
|
+
|
|
|
|
|
+ <div class="signature-item">
|
|
|
|
|
+ <span>老年人或相关第三方签名:</span>
|
|
|
|
|
+
|
|
|
|
|
+ </div>
|
|
|
|
|
+ </div>
|
|
|
|
|
+
|
|
|
|
|
+ ${dataForm.remark ? `<div class="section-title">其他备注:</div><div>${dataForm.remark}</div>` : ''}
|
|
|
|
|
+ </div>
|
|
|
|
|
+ <script>
|
|
|
|
|
+ window.onload = function() {
|
|
|
|
|
+ setTimeout(function() {
|
|
|
|
|
+ window.print();
|
|
|
|
|
+ }, 500);
|
|
|
|
|
+ };
|
|
|
|
|
+ <\/script>
|
|
|
|
|
+ </body>
|
|
|
|
|
+ </html>
|
|
|
|
|
+ `
|
|
|
|
|
+
|
|
|
|
|
+ printWindow.document.write(printContent)
|
|
|
|
|
+ printWindow.document.close()
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+// 获取风险等级文本
|
|
|
|
|
+const getRiskLevelText = (level: string): string => {
|
|
|
|
|
+ const levelMap: Record<string, string> = {
|
|
|
|
|
+ 'none': '无风险',
|
|
|
|
|
+ 'low': '低风险',
|
|
|
|
|
+ 'medium': '中风险',
|
|
|
|
|
+ 'high': '高风险'
|
|
|
|
|
+ }
|
|
|
|
|
+ return levelMap[level] || level || '-'
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
defineExpose({ open })
|
|
defineExpose({ open })
|
|
|
</script>
|
|
</script>
|
|
|
|
|
|
|
@@ -444,25 +643,125 @@ defineExpose({ open })
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-.risk-list {
|
|
|
|
|
- margin: 15px 0;
|
|
|
|
|
|
|
+// 风险表格样式
|
|
|
|
|
+.risk-table-wrapper {
|
|
|
|
|
+ margin: 20px 0;
|
|
|
|
|
+ overflow-x: auto;
|
|
|
|
|
+
|
|
|
|
|
+ .risk-table {
|
|
|
|
|
+ width: 100%;
|
|
|
|
|
+ border-collapse: collapse;
|
|
|
|
|
+ font-size: 14px;
|
|
|
|
|
|
|
|
- .risk-item {
|
|
|
|
|
|
|
+ th, td {
|
|
|
|
|
+ border: 1px solid #dcdfe6;
|
|
|
|
|
+ padding: 10px 8px;
|
|
|
|
|
+ text-align: center;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ th {
|
|
|
|
|
+ background-color: #f5f7fa;
|
|
|
|
|
+ font-weight: bold;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ .col-index {
|
|
|
|
|
+ width: 60px;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ .col-project {
|
|
|
|
|
+ width: 180px;
|
|
|
|
|
+ text-align: left;
|
|
|
|
|
+ padding-left: 15px;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ .col-level {
|
|
|
|
|
+ width: 140px;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ .col-remark {
|
|
|
|
|
+ width: auto;
|
|
|
|
|
+ text-align: left;
|
|
|
|
|
+ padding-left: 15px;
|
|
|
|
|
+
|
|
|
|
|
+ .remark-text {
|
|
|
|
|
+ margin-right: 10px;
|
|
|
|
|
+ color: #606266;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ :deep(.el-checkbox) {
|
|
|
|
|
+ margin-right: 15px;
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+// 预计下次评估日期
|
|
|
|
|
+.next-assess-date {
|
|
|
|
|
+ display: flex;
|
|
|
|
|
+ align-items: center;
|
|
|
|
|
+ margin: 20px 0;
|
|
|
|
|
+ padding: 15px;
|
|
|
|
|
+ background-color: #f5f7fa;
|
|
|
|
|
+ border-radius: 4px;
|
|
|
|
|
+
|
|
|
|
|
+ .date-label {
|
|
|
|
|
+ font-weight: bold;
|
|
|
|
|
+ margin-right: 15px;
|
|
|
|
|
+ color: #333;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ .date-value {
|
|
|
|
|
+ margin-left: 15px;
|
|
|
|
|
+ color: #606266;
|
|
|
|
|
+ }
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+// 签名区域
|
|
|
|
|
+.signature-section {
|
|
|
|
|
+ margin-top: 30px;
|
|
|
|
|
+ padding: 20px;
|
|
|
|
|
+ background-color: #fafafa;
|
|
|
|
|
+ border-radius: 4px;
|
|
|
|
|
+ border: 1px solid #ebeef5;
|
|
|
|
|
+
|
|
|
|
|
+ .signature-title {
|
|
|
|
|
+ font-size: 16px;
|
|
|
|
|
+ font-weight: bold;
|
|
|
|
|
+ margin-bottom: 15px;
|
|
|
|
|
+ color: #333;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ .signature-desc {
|
|
|
|
|
+ text-indent: 2em;
|
|
|
|
|
+ line-height: 1.8;
|
|
|
|
|
+ margin-bottom: 10px;
|
|
|
|
|
+ color: #606266;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ .signature-declare {
|
|
|
|
|
+ text-indent: 2em;
|
|
|
|
|
+ margin-bottom: 25px;
|
|
|
|
|
+ color: #909399;
|
|
|
|
|
+ font-size: 13px;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ .signature-item {
|
|
|
display: flex;
|
|
display: flex;
|
|
|
align-items: center;
|
|
align-items: center;
|
|
|
- margin-bottom: 10px;
|
|
|
|
|
- padding: 8px;
|
|
|
|
|
- background-color: #fff;
|
|
|
|
|
- border-radius: 4px;
|
|
|
|
|
-
|
|
|
|
|
- .risk-label {
|
|
|
|
|
- margin-left: 20px;
|
|
|
|
|
- margin-right: 10px;
|
|
|
|
|
- color: #666;
|
|
|
|
|
|
|
+ margin-bottom: 20px;
|
|
|
|
|
+
|
|
|
|
|
+ .signature-label {
|
|
|
|
|
+ font-weight: bold;
|
|
|
|
|
+ white-space: nowrap;
|
|
|
|
|
+ color: #333;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- :deep(.el-checkbox) {
|
|
|
|
|
- min-width: 120px;
|
|
|
|
|
|
|
+ .signature-line {
|
|
|
|
|
+ flex: 1;
|
|
|
|
|
+ height: 1px;
|
|
|
|
|
+ border-bottom: 1px solid #333;
|
|
|
|
|
+ margin-left: 10px;
|
|
|
|
|
+ min-width: 200px;
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|