- 根据申请单状态动态展示操作按钮(详情/修改/删除/撤回/打印/看报告) - 待签发状态:显示修改、删除按钮 - 已签发状态:显示撤回按钮 - 已校对/待接收状态:显示打印按钮 - 已接收/已检查/已出报告状态:显示打印、看报告按钮 - 新增修改申请单弹窗和报告查看弹窗 - 新增删除、撤回申请单 API 调用 Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
807 lines
25 KiB
Vue
Executable File
807 lines
25 KiB
Vue
Executable File
<!--
|
||
* @Author: sjjh
|
||
* @Date: 2025-09-05 21:16:06
|
||
* @Description: 检查申请
|
||
-->
|
||
<template>
|
||
<div class="report-container">
|
||
<div class="report-section">
|
||
<div class="report-title">
|
||
<span>检查申请</span>
|
||
<el-icon
|
||
class="report-refresh-icon"
|
||
:class="{ 'is-loading': loading }"
|
||
@click="handleRefresh"
|
||
>
|
||
<Refresh />
|
||
</el-icon>
|
||
</div>
|
||
<!-- 筛选表单 -->
|
||
<div class="filter-form">
|
||
<el-form :inline="true" :model="filterForm" class="filter-form-content">
|
||
<el-form-item label="申请日期">
|
||
<el-date-picker
|
||
v-model="filterForm.dateRange"
|
||
type="daterange"
|
||
range-separator="至"
|
||
start-placeholder="开始日期"
|
||
end-placeholder="结束日期"
|
||
value-format="YYYY-MM-DD"
|
||
clearable
|
||
style="width: 240px"
|
||
/>
|
||
</el-form-item>
|
||
<el-form-item label="申请单状态">
|
||
<el-select
|
||
v-model="filterForm.status"
|
||
placeholder="请选择"
|
||
clearable
|
||
style="width: 150px"
|
||
>
|
||
<el-option label="全部" value="" />
|
||
<el-option label="待签发" value="0" />
|
||
<el-option label="已签发" value="1" />
|
||
<el-option label="已校对" value="2" />
|
||
<el-option label="待接收" value="3" />
|
||
<el-option label="已接收" value="4" />
|
||
<el-option label="已检查" value="5" />
|
||
<el-option label="已出报告" value="6" />
|
||
<el-option label="已作废" value="7" />
|
||
</el-select>
|
||
</el-form-item>
|
||
<el-form-item label="关键字">
|
||
<el-input
|
||
v-model="filterForm.keyword"
|
||
placeholder="申请单号/检查项目"
|
||
clearable
|
||
style="width: 200px"
|
||
@keyup.enter="handleSearch"
|
||
/>
|
||
</el-form-item>
|
||
<el-form-item>
|
||
<el-button type="primary" @click="handleSearch" :loading="loading">
|
||
<el-icon><Search /></el-icon>
|
||
查询
|
||
</el-button>
|
||
<el-button @click="handleReset">
|
||
<el-icon><Refresh /></el-icon>
|
||
重置
|
||
</el-button>
|
||
</el-form-item>
|
||
</el-form>
|
||
</div>
|
||
<div class="report-table-wrapper">
|
||
<el-table
|
||
v-loading="loading"
|
||
:data="tableData"
|
||
border
|
||
size="small"
|
||
height="100%"
|
||
style="width: 100%"
|
||
>
|
||
<template #empty>
|
||
<div class="empty-data">
|
||
<el-empty description="暂无匹配记录" :image-size="80" />
|
||
</div>
|
||
</template>
|
||
<el-table-column type="index" label="序号" width="60" align="center" />
|
||
<el-table-column prop="patientName" label="患者姓名" width="120" />
|
||
<el-table-column prop="name" label="申请单名称" width="140" />
|
||
<el-table-column prop="createTime" label="创建时间" width="160" />
|
||
<el-table-column prop="prescriptionNo" label="处方号" width="140" />
|
||
<el-table-column prop="requesterId_dictText" label="申请者" width="120" />
|
||
<el-table-column label="申请单状态" width="120" align="center">
|
||
<template #default="scope">
|
||
<span>{{ parseStatus(scope.row.status) }}</span>
|
||
</template>
|
||
</el-table-column>
|
||
<el-table-column label="操作" align="center" fixed="right" width="240">
|
||
<template #default="scope">
|
||
<el-button link type="primary" @click="handleViewDetail(scope.row)">详情</el-button>
|
||
<!-- 待签发:修改、删除 -->
|
||
<template v-if="scope.row.status === '0' || scope.row.status === 0">
|
||
<el-button link type="primary" @click="handleEdit(scope.row)">修改</el-button>
|
||
<el-popconfirm
|
||
title="确认删除该申请单?"
|
||
@confirm="handleDelete(scope.row)"
|
||
width="200"
|
||
>
|
||
<template #reference>
|
||
<el-button link type="danger">删除</el-button>
|
||
</template>
|
||
</el-popconfirm>
|
||
</template>
|
||
<!-- 已签发(护士未校对):撤回 -->
|
||
<template v-else-if="scope.row.status === '1' || scope.row.status === 1">
|
||
<el-popconfirm
|
||
title="确认撤回该申请单?撤回后将回滚至待签发状态"
|
||
@confirm="handleWithdraw(scope.row)"
|
||
width="260"
|
||
>
|
||
<template #reference>
|
||
<el-button link type="warning">撤回</el-button>
|
||
</template>
|
||
</el-popconfirm>
|
||
</template>
|
||
<!-- 已校对/待接收:打印 -->
|
||
<template v-else-if="scope.row.status === '2' || scope.row.status === 2 || scope.row.status === '3' || scope.row.status === 3">
|
||
<el-button link type="primary" @click="handlePrint(scope.row)">打印</el-button>
|
||
</template>
|
||
<!-- 已接收/已检查:打印、看报告 -->
|
||
<template v-else-if="scope.row.status === '4' || scope.row.status === 4 || scope.row.status === '5' || scope.row.status === 5">
|
||
<el-button link type="primary" @click="handlePrint(scope.row)">打印</el-button>
|
||
<el-button link type="primary" @click="handleViewReport(scope.row)">看报告</el-button>
|
||
</template>
|
||
<!-- 已出报告:打印、看报告 -->
|
||
<template v-else-if="scope.row.status === '6' || scope.row.status === 6">
|
||
<el-button link type="primary" @click="handlePrint(scope.row)">打印</el-button>
|
||
<el-button link type="success" @click="handleViewReport(scope.row)">看报告</el-button>
|
||
</template>
|
||
<!-- 已作废:仅详情 -->
|
||
</template>
|
||
</el-table-column>
|
||
</el-table>
|
||
</div>
|
||
</div>
|
||
<!-- 详情弹窗 -->
|
||
<el-dialog
|
||
v-model="detailDialogVisible"
|
||
title="检查申请详情"
|
||
width="800px"
|
||
destroy-on-close
|
||
top="5vh"
|
||
:close-on-click-modal="false"
|
||
>
|
||
<div v-if="currentDetail" class="applicationShow-container">
|
||
<div class="applicationShow-container-content">
|
||
<el-descriptions title="基本信息" :column="2">
|
||
<el-descriptions-item label="患者姓名">{{
|
||
currentDetail.patientName || '-'
|
||
}}</el-descriptions-item>
|
||
<el-descriptions-item label="申请单名称">{{
|
||
currentDetail.name || '-'
|
||
}}</el-descriptions-item>
|
||
<el-descriptions-item label="申请单状态">{{
|
||
parseStatus(currentDetail.status)
|
||
}}</el-descriptions-item>
|
||
<el-descriptions-item label="创建时间">{{
|
||
currentDetail.createTime || '-'
|
||
}}</el-descriptions-item>
|
||
<el-descriptions-item label="处方号">{{
|
||
currentDetail.prescriptionNo || '-'
|
||
}}</el-descriptions-item>
|
||
<el-descriptions-item label="申请者">{{
|
||
currentDetail.requesterId_dictText || '-'
|
||
}}</el-descriptions-item>
|
||
<el-descriptions-item label="就诊ID">{{
|
||
currentDetail.encounterId || '-'
|
||
}}</el-descriptions-item>
|
||
<el-descriptions-item label="申请单ID">{{
|
||
currentDetail.requestFormId || '-'
|
||
}}</el-descriptions-item>
|
||
</el-descriptions>
|
||
</div>
|
||
|
||
<div v-if="descJsonData && hasMatchedFields" class="applicationShow-container-content">
|
||
<el-descriptions title="申请单描述" :column="2">
|
||
<template v-for="(value, key) in descJsonData" :key="key">
|
||
<el-descriptions-item v-if="isFieldMatched(key)" :label="getFieldLabel(key)">
|
||
{{ value || '-' }}
|
||
</el-descriptions-item>
|
||
</template>
|
||
</el-descriptions>
|
||
</div>
|
||
|
||
<div
|
||
v-if="currentDetail.requestFormDetailList && currentDetail.requestFormDetailList.length"
|
||
class="applicationShow-container-table"
|
||
>
|
||
<el-table :data="currentDetail.requestFormDetailList" border>
|
||
<el-table-column type="index" label="序号" width="60" align="center" />
|
||
<el-table-column prop="adviceName" label="医嘱名称" />
|
||
<el-table-column prop="quantity" label="数量" width="80" align="center" />
|
||
<el-table-column prop="unitCode_dictText" label="单位" width="100" />
|
||
<el-table-column prop="totalPrice" label="总价" width="100" align="right" />
|
||
</el-table>
|
||
</div>
|
||
</div>
|
||
<template #footer>
|
||
<el-button @click="detailDialogVisible = false">关闭</el-button>
|
||
</template>
|
||
</el-dialog>
|
||
<!-- 修改申请单弹窗 -->
|
||
<el-dialog
|
||
v-model="editDialogVisible"
|
||
title="修改检查申请"
|
||
width="800px"
|
||
destroy-on-close
|
||
top="5vh"
|
||
:close-on-click-modal="false"
|
||
>
|
||
<div v-if="editDetail" class="applicationShow-container">
|
||
<el-form :model="editForm" label-width="120px">
|
||
<el-form-item label="申请单名称">
|
||
<el-input v-model="editForm.name" />
|
||
</el-form-item>
|
||
<el-form-item label="临床诊断">
|
||
<el-input v-model="editForm.clinicalDiagnosis" type="textarea" :rows="2" />
|
||
</el-form-item>
|
||
<el-form-item label="注意事项">
|
||
<el-input v-model="editForm.attention" type="textarea" :rows="2" />
|
||
</el-form-item>
|
||
<div v-if="editDetail.requestFormDetailList && editDetail.requestFormDetailList.length">
|
||
<el-divider>申请项目</el-divider>
|
||
<el-table :data="editDetail.requestFormDetailList" border size="small">
|
||
<el-table-column type="index" label="序号" width="60" align="center" />
|
||
<el-table-column prop="adviceName" label="医嘱名称" />
|
||
<el-table-column prop="quantity" label="数量" width="80" align="center" />
|
||
<el-table-column prop="unitCode_dictText" label="单位" width="100" />
|
||
<el-table-column prop="totalPrice" label="总价" width="100" align="right" />
|
||
</el-table>
|
||
</div>
|
||
</el-form>
|
||
</div>
|
||
<template #footer>
|
||
<el-button @click="editDialogVisible = false">取消</el-button>
|
||
<el-button type="primary" @click="handleSaveEdit" :loading="saveLoading">保存</el-button>
|
||
</template>
|
||
</el-dialog>
|
||
<!-- 报告查看弹窗 -->
|
||
<el-dialog
|
||
v-model="reportDialogVisible"
|
||
title="检查报告"
|
||
width="900px"
|
||
destroy-on-close
|
||
top="5vh"
|
||
:close-on-click-modal="false"
|
||
>
|
||
<div v-if="reportUrl" style="min-height: 500px;">
|
||
<iframe :src="reportUrl" style="width: 100%; height: 500px; border: none;" />
|
||
</div>
|
||
<el-empty v-else description="暂无报告数据" />
|
||
<template #footer>
|
||
<el-button @click="reportDialogVisible = false">关闭</el-button>
|
||
</template>
|
||
</el-dialog>
|
||
</div>
|
||
</template>
|
||
|
||
<script setup>
|
||
import {computed, getCurrentInstance, ref, watch} from 'vue';
|
||
import {Refresh, Search} from '@element-plus/icons-vue';
|
||
import {patientInfo} from '../../store/patient.js';
|
||
import {getCheck, deleteRequestForm, withdrawRequestForm, getTestResult} from './api';
|
||
import {getOrgList} from '@/views/doctorstation/components/api.js';
|
||
|
||
const { proxy } = getCurrentInstance();
|
||
|
||
const tableData = ref([]);
|
||
const loading = ref(false);
|
||
const detailDialogVisible = ref(false);
|
||
const currentDetail = ref(null);
|
||
const descJsonData = ref(null);
|
||
const orgOptions = ref([]);
|
||
|
||
// 修改申请单相关
|
||
const editDialogVisible = ref(false);
|
||
const editDetail = ref(null);
|
||
const editForm = ref({});
|
||
const saveLoading = ref(false);
|
||
|
||
// 报告查看相关
|
||
const reportDialogVisible = ref(false);
|
||
const reportUrl = ref('');
|
||
|
||
// 筛选表单数据
|
||
const getDefaultDateRange = () => {
|
||
const now = new Date();
|
||
const weekAgo = new Date(now.getTime() - 7 * 24 * 60 * 60 * 1000);
|
||
const formatDate = (d) => {
|
||
const year = d.getFullYear();
|
||
const month = String(d.getMonth() + 1).padStart(2, '0');
|
||
const day = String(d.getDate()).padStart(2, '0');
|
||
return `${year}-${month}-${day}`;
|
||
};
|
||
return [formatDate(weekAgo), formatDate(now)];
|
||
};
|
||
|
||
const filterForm = ref({
|
||
dateRange: getDefaultDateRange(), // 默认近一周
|
||
status: '', // 申请单状态
|
||
keyword: '', // 关键字搜索
|
||
});
|
||
|
||
const fetchData = async () => {
|
||
if (!patientInfo.value?.encounterId) {
|
||
tableData.value = [];
|
||
loading.value = false;
|
||
return;
|
||
}
|
||
loading.value = true;
|
||
try {
|
||
// 构建查询参数
|
||
const params = { encounterId: patientInfo.value.encounterId };
|
||
|
||
// 添加日期范围筛选
|
||
if (filterForm.value.dateRange && filterForm.value.dateRange.length === 2) {
|
||
params.startDate = filterForm.value.dateRange[0];
|
||
params.endDate = filterForm.value.dateRange[1];
|
||
}
|
||
|
||
// 添加状态筛选
|
||
if (filterForm.value.status !== '' && filterForm.value.status !== undefined) {
|
||
params.status = filterForm.value.status;
|
||
}
|
||
|
||
// 添加关键字搜索
|
||
if (filterForm.value.keyword && filterForm.value.keyword.trim()) {
|
||
params.keyword = filterForm.value.keyword.trim();
|
||
}
|
||
|
||
const res = await getCheck(params);
|
||
if (res.code === 200 && res.data) {
|
||
const raw = res.data?.records || res.data;
|
||
const list = Array.isArray(raw) ? raw : [raw];
|
||
tableData.value = list.filter(Boolean);
|
||
} else {
|
||
tableData.value = [];
|
||
}
|
||
} catch (e) {
|
||
console.warn('查询检查申请失败:', e.message);
|
||
tableData.value = [];
|
||
} finally {
|
||
loading.value = false;
|
||
}
|
||
};
|
||
|
||
const handleRefresh = async () => {
|
||
if (loading.value || !patientInfo.value?.encounterId) return;
|
||
await fetchData();
|
||
};
|
||
|
||
/**
|
||
* 查询按钮处理
|
||
*/
|
||
const handleSearch = async () => {
|
||
if (!patientInfo.value?.encounterId) {
|
||
proxy.$modal?.msgWarning?.('请先选择患者');
|
||
return;
|
||
}
|
||
await fetchData();
|
||
};
|
||
|
||
/**
|
||
* 重置按钮处理
|
||
*/
|
||
const handleReset = () => {
|
||
filterForm.value.dateRange = getDefaultDateRange();
|
||
filterForm.value.status = '';
|
||
filterForm.value.keyword = '';
|
||
fetchData();
|
||
};
|
||
|
||
/**
|
||
* 解析申请单状态
|
||
* @param {string|number} status - 状态码
|
||
* @returns {string} 状态文本
|
||
*/
|
||
const parseStatus = (status) => {
|
||
const statusMap = {
|
||
'0': '待签发',
|
||
'1': '已签发',
|
||
'2': '已校对',
|
||
'3': '待接收',
|
||
'4': '已接收',
|
||
'5': '已检查',
|
||
'6': '已出报告',
|
||
'7': '已作废',
|
||
};
|
||
return statusMap[String(status)] || '-';
|
||
};
|
||
|
||
const labelMap = {
|
||
categoryType: '项目类别',
|
||
targetDepartment: '发往科室',
|
||
symptom: '症状',
|
||
sign: '体征',
|
||
clinicalDiagnosis: '临床诊断',
|
||
otherDiagnosis: '其他诊断',
|
||
relatedResult: '相关结果',
|
||
attention: '注意事项',
|
||
};
|
||
|
||
const isFieldMatched = (key) => {
|
||
return key in labelMap;
|
||
};
|
||
|
||
const getFieldLabel = (key) => {
|
||
return labelMap[key] || key;
|
||
};
|
||
|
||
const hasMatchedFields = computed(() => {
|
||
if (!descJsonData.value) return false;
|
||
return Object.keys(descJsonData.value).some((key) => isFieldMatched(key));
|
||
});
|
||
|
||
/** 查询科室 */
|
||
const getLocationInfo = () => {
|
||
getOrgList().then((res) => {
|
||
orgOptions.value = res.data.records;
|
||
});
|
||
};
|
||
|
||
const recursionFun = (targetDepartment) => {
|
||
let name = '';
|
||
for (let index = 0; index < orgOptions.value.length; index++) {
|
||
const obj = orgOptions.value[index];
|
||
if (obj.id == targetDepartment) {
|
||
name = obj.name;
|
||
}
|
||
const subObjArray = obj['children'];
|
||
for (let index = 0; index < subObjArray.length; index++) {
|
||
const item = subObjArray[index];
|
||
if (item.id == targetDepartment) {
|
||
name = item.name;
|
||
}
|
||
}
|
||
}
|
||
return name;
|
||
};
|
||
|
||
const handleViewDetail = (row) => {
|
||
console.log('targetDepartment========>', JSON.stringify(row));
|
||
|
||
currentDetail.value = row;
|
||
// 解析 descJson
|
||
if (row.descJson) {
|
||
try {
|
||
const obj = JSON.parse(row.descJson);
|
||
obj.targetDepartment = recursionFun(obj.targetDepartment);
|
||
descJsonData.value = obj;
|
||
} catch (e) {
|
||
console.error('解析 descJson 失败:', e);
|
||
descJsonData.value = null;
|
||
}
|
||
} else {
|
||
descJsonData.value = null;
|
||
}
|
||
detailDialogVisible.value = true;
|
||
};
|
||
|
||
/**
|
||
* 修改申请单
|
||
*/
|
||
const handleEdit = (row) => {
|
||
editDetail.value = row;
|
||
// 解析 descJson 为表单数据
|
||
const form = { name: row.name || '' };
|
||
if (row.descJson) {
|
||
try {
|
||
const desc = JSON.parse(row.descJson);
|
||
form.clinicalDiagnosis = desc.clinicalDiagnosis || '';
|
||
form.attention = desc.attention || '';
|
||
form.symptom = desc.symptom || '';
|
||
form.sign = desc.sign || '';
|
||
} catch (e) {
|
||
console.error('解析 descJson 失败:', e);
|
||
}
|
||
}
|
||
editForm.value = form;
|
||
editDialogVisible.value = true;
|
||
};
|
||
|
||
/**
|
||
* 保存修改
|
||
*/
|
||
const handleSaveEdit = async () => {
|
||
if (!editDetail.value?.requestFormId) {
|
||
proxy.$modal?.msgWarning?.('申请单ID不存在');
|
||
return;
|
||
}
|
||
saveLoading.value = true;
|
||
try {
|
||
// 复用 save-check 接口进行更新(传入 requestFormId 即为编辑场景)
|
||
const res = await proxy.$http?.post?.('/reg-doctorstation/request-form/save-check', {
|
||
requestFormId: editDetail.value.requestFormId,
|
||
encounterId: editDetail.value.encounterId,
|
||
patientId: editDetail.value.patientId,
|
||
name: editForm.value.name,
|
||
organizationId: editDetail.value.inHospitalOrgId || patientInfo.value?.inHospitalOrgId,
|
||
descJson: JSON.stringify({
|
||
clinicalDiagnosis: editForm.value.clinicalDiagnosis,
|
||
attention: editForm.value.attention,
|
||
symptom: editForm.value.symptom,
|
||
sign: editForm.value.sign,
|
||
}),
|
||
activityList: [], // 修改场景仅更新描述信息,不修改项目
|
||
});
|
||
if (res?.code === 200) {
|
||
proxy.$modal?.msgSuccess?.('修改成功');
|
||
editDialogVisible.value = false;
|
||
await fetchData();
|
||
} else {
|
||
proxy.$modal?.msgError?.(res?.msg || '修改失败');
|
||
}
|
||
} catch (e) {
|
||
console.warn('修改申请单失败:', e.message);
|
||
proxy.$modal?.msgError?.('修改失败: ' + (e.message || '网络异常'));
|
||
} finally {
|
||
saveLoading.value = false;
|
||
}
|
||
};
|
||
|
||
/**
|
||
* 删除申请单(仅待签发状态可删除)
|
||
*/
|
||
const handleDelete = async (row) => {
|
||
if (!row.requestFormId) {
|
||
proxy.$modal?.msgWarning?.('申请单ID不存在');
|
||
return;
|
||
}
|
||
try {
|
||
const res = await deleteRequestForm({ requestFormId: row.requestFormId });
|
||
if (res?.code === 200) {
|
||
proxy.$modal?.msgSuccess?.('删除成功');
|
||
await fetchData();
|
||
} else {
|
||
proxy.$modal?.msgError?.(res?.msg || '删除失败');
|
||
}
|
||
} catch (e) {
|
||
console.warn('删除申请单失败:', e.message);
|
||
proxy.$modal?.msgError?.('删除失败: ' + (e.message || '网络异常'));
|
||
}
|
||
};
|
||
|
||
/**
|
||
* 撤回申请单(已签发状态撤回至待签发)
|
||
*/
|
||
const handleWithdraw = async (row) => {
|
||
if (!row.requestFormId) {
|
||
proxy.$modal?.msgWarning?.('申请单ID不存在');
|
||
return;
|
||
}
|
||
try {
|
||
const res = await withdrawRequestForm({ requestFormId: row.requestFormId });
|
||
if (res?.code === 200) {
|
||
proxy.$modal?.msgSuccess?.('撤回成功');
|
||
await fetchData();
|
||
} else {
|
||
proxy.$modal?.msgError?.(res?.msg || '撤回失败');
|
||
}
|
||
} catch (e) {
|
||
console.warn('撤回申请单失败:', e.message);
|
||
proxy.$modal?.msgError?.('撤回失败: ' + (e.message || '网络异常'));
|
||
}
|
||
};
|
||
|
||
/**
|
||
* 打印申请单
|
||
*/
|
||
const handlePrint = (row) => {
|
||
// 打开新窗口进行打印
|
||
const printWindow = window.open('', '_blank');
|
||
if (!printWindow) {
|
||
proxy.$modal?.msgWarning?.('请允许浏览器弹出窗口以进行打印');
|
||
return;
|
||
}
|
||
const content = buildPrintContent(row);
|
||
printWindow.document.write(`
|
||
<!DOCTYPE html>
|
||
<html>
|
||
<head>
|
||
<meta charset="utf-8">
|
||
<title>检查申请单打印</title>
|
||
<style>
|
||
body { font-family: "Microsoft YaHei", sans-serif; padding: 20px; font-size: 14px; }
|
||
h2 { text-align: center; margin-bottom: 20px; }
|
||
table { width: 100%; border-collapse: collapse; margin-top: 10px; }
|
||
th, td { border: 1px solid #ddd; padding: 8px; text-align: left; }
|
||
th { background: #f5f5f5; }
|
||
.info-row { margin: 8px 0; }
|
||
.label { font-weight: bold; display: inline-block; width: 100px; }
|
||
@media print { .no-print { display: none; } }
|
||
</style>
|
||
</head>
|
||
<body>
|
||
${content}
|
||
<div class="no-print" style="text-align: center; margin-top: 20px;">
|
||
<button onclick="window.print()">打印</button>
|
||
<button onclick="window.close()">关闭</button>
|
||
</div>
|
||
</body>
|
||
</html>
|
||
`);
|
||
printWindow.document.close();
|
||
};
|
||
|
||
/**
|
||
* 构建打印内容
|
||
*/
|
||
const buildPrintContent = (row) => {
|
||
let descHtml = '';
|
||
if (row.descJson) {
|
||
try {
|
||
const desc = JSON.parse(row.descJson);
|
||
descHtml = Object.entries(labelMap)
|
||
.filter(([key]) => desc[key])
|
||
.map(([key, label]) => `<div class="info-row"><span class="label">${label}:</span>${desc[key]}</div>`)
|
||
.join('');
|
||
} catch (e) {
|
||
console.error('解析 descJson 失败:', e);
|
||
}
|
||
}
|
||
let itemsHtml = '';
|
||
if (row.requestFormDetailList && row.requestFormDetailList.length) {
|
||
itemsHtml = `
|
||
<h3>申请项目</h3>
|
||
<table>
|
||
<tr><th>序号</th><th>医嘱名称</th><th>数量</th><th>单位</th><th>总价</th></tr>
|
||
${row.requestFormDetailList.map((item, i) => `
|
||
<tr>
|
||
<td>${i + 1}</td>
|
||
<td>${item.adviceName || '-'}</td>
|
||
<td>${item.quantity || '-'}</td>
|
||
<td>${item.unitCode_dictText || '-'}</td>
|
||
<td>${item.totalPrice || '-'}</td>
|
||
</tr>
|
||
`).join('')}
|
||
</table>
|
||
`;
|
||
}
|
||
return `
|
||
<h2>检查申请单</h2>
|
||
<div class="info-row"><span class="label">患者姓名:</span>${row.patientName || '-'}</div>
|
||
<div class="info-row"><span class="label">申请单名称:</span>${row.name || '-'}</div>
|
||
<div class="info-row"><span class="label">创建时间:</span>${row.createTime || '-'}</div>
|
||
<div class="info-row"><span class="label">处方号:</span>${row.prescriptionNo || '-'}</div>
|
||
<div class="info-row"><span class="label">申请者:</span>${row.requesterId_dictText || '-'}</div>
|
||
<div class="info-row"><span class="label">申请单状态:</span>${parseStatus(row.status)}</div>
|
||
${descHtml ? `<h3>申请单描述</h3>${descHtml}` : ''}
|
||
${itemsHtml}
|
||
`;
|
||
};
|
||
|
||
/**
|
||
* 查看报告
|
||
*/
|
||
const handleViewReport = async (row) => {
|
||
reportUrl.value = '';
|
||
reportDialogVisible.value = true;
|
||
try {
|
||
const res = await getTestResult({ encounterId: row.encounterId, requestFormId: row.requestFormId });
|
||
if (res?.code === 200 && res?.data) {
|
||
reportUrl.value = res.data;
|
||
} else {
|
||
console.warn('获取检查报告失败:', res?.msg || '无数据');
|
||
}
|
||
} catch (e) {
|
||
console.warn('获取检查报告异常:', e.message);
|
||
}
|
||
};
|
||
|
||
watch(
|
||
() => patientInfo.value?.encounterId,
|
||
(val) => {
|
||
if (val) {
|
||
fetchData();
|
||
getLocationInfo();
|
||
} else {
|
||
tableData.value = [];
|
||
filterForm.value.dateRange = getDefaultDateRange();
|
||
filterForm.value.status = '';
|
||
filterForm.value.keyword = '';
|
||
}
|
||
},
|
||
{ immediate: true }
|
||
);
|
||
|
||
defineExpose({
|
||
refresh: fetchData,
|
||
});
|
||
</script>
|
||
|
||
<style scoped lang="scss">
|
||
.report-container {
|
||
display: flex;
|
||
flex-direction: column;
|
||
gap: 12px;
|
||
padding: 8px 0;
|
||
height: 100%;
|
||
}
|
||
|
||
.report-section {
|
||
background: #fff;
|
||
flex: 1;
|
||
min-height: 0;
|
||
display: flex;
|
||
flex-direction: column;
|
||
}
|
||
|
||
.report-title {
|
||
font-weight: 600;
|
||
margin-bottom: 8px;
|
||
display: flex;
|
||
align-items: center;
|
||
justify-content: space-between;
|
||
padding: 0 8px;
|
||
}
|
||
|
||
.filter-form {
|
||
padding: 12px 8px;
|
||
border-bottom: 1px solid #ebeef5;
|
||
background-color: #fafafa;
|
||
}
|
||
|
||
.filter-form-content {
|
||
:deep(.el-form-item) {
|
||
margin-bottom: 0;
|
||
margin-right: 16px;
|
||
}
|
||
|
||
:deep(.el-form-item__label) {
|
||
font-weight: 500;
|
||
}
|
||
}
|
||
|
||
.report-table-wrapper {
|
||
flex: 1;
|
||
min-height: 0;
|
||
overflow: auto;
|
||
padding: 0 8px;
|
||
}
|
||
|
||
.empty-data {
|
||
padding: 40px 0;
|
||
display: flex;
|
||
justify-content: center;
|
||
align-items: center;
|
||
}
|
||
|
||
.report-refresh-icon {
|
||
cursor: pointer;
|
||
color: #909399;
|
||
transition: color 0.2s;
|
||
font-size: 18px;
|
||
}
|
||
|
||
.report-refresh-icon:hover {
|
||
color: #409eff;
|
||
}
|
||
|
||
.report-refresh-icon.is-loading {
|
||
animation: rotating 2s linear infinite;
|
||
}
|
||
|
||
@keyframes rotating {
|
||
0% {
|
||
transform: rotate(0deg);
|
||
}
|
||
100% {
|
||
transform: rotate(360deg);
|
||
}
|
||
}
|
||
|
||
:deep(.el-dialog__body) {
|
||
padding-top: 0 !important;
|
||
}
|
||
|
||
.applicationShow-container {
|
||
display: flex;
|
||
flex-direction: column;
|
||
max-height: 70vh;
|
||
width: 100%;
|
||
overflow-y: auto;
|
||
|
||
.applicationShow-container-content {
|
||
flex-shrink: 0;
|
||
margin-bottom: 0px;
|
||
}
|
||
|
||
.applicationShow-container-table {
|
||
flex-shrink: 0;
|
||
max-height: 3000px;
|
||
overflow: auto;
|
||
}
|
||
}
|
||
</style>
|